# Intro to Rails 5 Workshop ## 0. Configuration Ruby 2.4.0 & Rails 5.2.0 ### How to install Ruby 2.4.0 ```shell $ curl -sSL https://get.rvm.io | bash -s stable --ruby=2.4.0 ``` ### How to install Rails 5.2.0 ```shell $ gem install rails -v 5.2.0 ``` ## 1. Create Rails Project ```shell $ mkdir ~/sites $ cd ~/sites $ rails new mlh-prime --skip-turbolinks --skip-action-cable --skip-action-mailer --javascript=jquery --database=sqlite3 $ cd mlh-prime ``` ## 2. Create a Model-View-Controller ![](https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/MVC-basic.svg/600px-MVC-basic.svg.png) Run the following command: ```shell $ rails generate scaffold [MODEL_NAME_SINGULAR] [*FIELD_NAME:TYPE] $ rails generate scaffold Meetup name:string description:text location:string public:boolean time:datetime registration_url:string ``` Expected output: ```shell invoke active_record create db/migrate/20170331111551_create_meetups.rb create app/models/meetup.rb invoke test_unit create test/models/meetup_test.rb create test/fixtures/meetups.yml invoke resource_route route resources :meetups invoke scaffold_controller create app/controllers/meetups_controller.rb invoke erb create app/views/meetups create app/views/meetups/index.html.erb create app/views/meetups/edit.html.erb create app/views/meetups/show.html.erb create app/views/meetups/new.html.erb create app/views/meetups/_form.html.erb invoke test_unit create test/controllers/meetups_controller_test.rb invoke helper create app/helpers/meetups_helper.rb invoke test_unit invoke jbuilder create app/views/meetups/index.json.jbuilder create app/views/meetups/show.json.jbuilder create app/views/meetups/_meetup.json.jbuilder invoke assets invoke coffee create app/assets/javascripts/meetups.coffee invoke scss create app/assets/stylesheets/meetups.scss invoke scss create app/assets/stylesheets/scaffolds.scss ``` [Reference](http://guides.rubyonrails.org/active_model_basics.html) ## 3. Migrate Database ```shell $ rails db:migrate ``` Expected output: ```shell == 20170331112240 CreateMeetups: migrating ==================================== -- create_table(:meetups) -> 0.0007s == 20170331112240 CreateMeetups: migrated (0.0007s) =========================== ``` ## 4. Start server ```shell $ rails server --daemon ``` (And if you ever want to kill the server, you can run `$ kill $(cat tmp/pids/server.pid)`) ## 5. Add some validations to Meetup model To recall, our fields are: ``` name:string description:text location:string public:boolean time:datetime registration_url:string ``` Update `app/models/meetup.rb`: ```ruby # app/models/meetup.rb class Meetup < ApplicationRecord validates :name, presence: true, length: { minimum: 4, maximum: 100 }, uniqueness: { scope: :location } validates :description, presence: true, length: { minimum: 20, maximum: 400 } validates :location, presence: true, inclusion: { in: %w(London Manchester Birmingham) } validates :time, presence: true validates :registration_url, presence: true end ``` [Reference](http://guides.rubyonrails.org/active_record_validations.html) ## 6. Update routes.rb Update `config/routes.rb`: ```ruby # config/routes.rb Rails.application.routes.draw do resources :meetups root 'meetups#index' end ``` [Reference](http://guides.rubyonrails.org/routing.html) ## 7. Create a Registrations Controller Run the command: ```shell $ rails generate controller meetups/registrations new ``` Update `config/routes.rb`: ```ruby # config/routes.rb Rails.application.routes.draw do resources :meetups do resources :registrations, only: [:new] end root 'meetups#index' end ``` In `app/views/meetups/show.html.erb`, on the line where it says: ```ruby <%= link_to 'Edit', edit_meetup_path(@meetup) %> | ``` Add before: ``` <%= link_to 'Register', new_meetup_registration_path(@meetup) %> | ``` TODO: Update registrations controller to a) set the meetup and b) redirect to the registration_url ## 8. Extra Tasks - Add URL validation for our registrations controller - Add some styling around each meetup - Add some JavaScript interactivity - Add a JSON endpoint - Deploy to Heroku