6ftDan(TM) Rails Primer & Cheat Sheet

>> This is currently a fluctuating DRAFT VERSION <<

Installation

I recommend Bitnami’s all-in-one installer for the Ruby stack: https://bitnami.com/stack/ruby

Getting Started

echo 'generate folder and bare-bone project'
rails new MyProjectName

echo 'enter project directory'
cd MyProjectName

echo 'run a server on your local machine'
rails server

echo 'open your web browser to localhost:3000'
firefox localhost:3000

If you’ve never used, or tried, Rails before consider these steps as mandatory!  Rails isn’t a start from scratch system.  You get a basic “engine” with a bit of structure on which you work with.  If you want to build something entirely from scratch I’d recommend Sinatra as it’s really bare bones.

At this point you have a running Rails website and you can see it working when your browser is navigated to localhost:3000 .  You will want to check your updates as you go along in the browser to see if you break anything.

Heads Up Clue: To change what the first page loads as you will change your config/routes.rb file to whatever view you set up in the view folder.

The Layout

Most of what you build will entirely be in the sub-folder ‘app/’.

app/
  assets/
    images/
    javascripts/
    stylesheets/
  controllers/
  helpers/
  models/
  views/

These are the core folders you will be using for the project.

Generators

Just like the project structure was built with rails new, so also when you want to add a component of any kind there are generators to build the basic template structure of each part.  These are some of generator commands available:

assets
controller
generator
helper
inherited_resources_controller
integration_test
migration
model
resource
responders_controller
scaffold
scaffold_controller

At any time you can tack –help on the rails command to get more details.  You can get pretty specific with it to.  From rails –help to rails generate model –help .  This will give you a howto and detail on each usage and will help you get started the fastest.

The “all in one” generator is the scaffold generator.  When you’re generating a resource it typically goes by COMMAND RESOURCE FEILD1:TYPE FIELD2:TYPE etc.  For example:

rails generate scaffold Posts story:text subject:string:index user:references

Here user:references will do all the work of creating a belongs_to relationship to the User object.  You will still need to open up the app/models/users.rb file and add a line has_many :posts for the User object instances to refer back to the posts they own.  You don’t need to fully understand this yet, just know that when you have one object belongs_to :another object, the other object should say whether it has_one :object or has_many :objects.

Back to generators.  The scaffold generator builds the basic files for a view, controller, model, and helper.  These are each in their appropriately named folders under app/

If you don’t want to build the database model but you do want to build all the other application view/controller logic then you can use the scaffold_controller generator command instead.

Migrations

The default database in a generated project is Sqlite3 which doesn’t require system configuration to use.  After generating your model you will need to update the database before the rails server will work.  I recommend looking at the models you’ve generated in the db/migrate/ folder and make sure everything is as you would like it to be before updating your database tables.  Things like null: false, unique: true, and default: “value”.  Also if you didn’t specify as many indexes as you need you can add them near the end outside the create table block.

add_index :books, :publisher_name
add_index :books, :author
add_index :books, :name
add_index :books, [:author, :name]

Once you’ve verified your migrations are ready to be added to the database you can update the database from the command line.

echo 'if you haven't created the database yet use rake db:create'
rake db:create

echo 'update all your new migrations into the database'
rake db:migrate

echo 'forgot something? roll back as many migrations as you need'
rake db:rollback STEP=1

echo 'want to scrap the DB? drop the whole database'
rake db:drop

 Routes

The generators will build basic CRUD (Create Read Update Destroy/(Delete)) routes in your config/routs.rb file for each resource.  Example from Rails documentation:

HTTP Verb Path Controller#Action Used for
GET /photos photos#index display a list of all photos
GET /photos/new photos#new return an HTML form for creating a new photo
POST /photos photos#create create a new photo
GET /photos/:id photos#show display a specific photo
GET /photos/:id/edit photos#edit return an HTML form for editing a photo
PATCH/PUT /photos/:id photos#update update a specific photo
DELETE /photos/:id photos#destroy delete a specific photo

Generally it’s easiest to use the resources in the way they were intended to be used.  As you develop more experience customizing the resources will be more feasible.

Routing is configured in the config/routes.rb file.  The defacto way to use the resource routes is with the variable resources.

resources :contacts

The routing has been redesigned many time since Rails began so there are many ways to use it.

resources :users do
  collection do
    get 'check_valid_phone'
    get 'check_email_registered'
  end
end

get '/auth/:provider/callback' => 'omni_auth#callback'

match "/invite/:id", to: "invite#destroy", via: [:delete], as: 'destroy_invite'

resources :dashboards, only: [:index]
resources :events do
  collection do
    patch 'event_ids'
  end
end
match "/events/:id/join", to: "events#join", as: "join_event", via: :get
match '/inbox/', to: "inbox#index", via: [:get], as: 'inbox'
match '/email/send', to: 'emails#send_email', via: [:patch], as: 'send_email'
match '/email/autocomplete', to: 'emails#autocomplete', via: [:get], as: 'email_autocomplete'
resources :emails, path: 'email', only: [:show], as: 'email' do
  collection do
    patch 'email_ids'
  end
end
resources :tags, only: [:update]
resources :feedbacks, path: 'feedback', except: [:show, :new, :edit]

unauthenticated do
  root to: "visitors#index", as: :unauthenticated_root
end
authenticated :user do
  root to: "dashboards#index", as: :authenticated_root
end

authenticated :user, lambda {|u| !!AdminUser.where(email: u.email).first } do
  mount Resque::Server, :at => "/admin/resque"
  scope :admin do
    devise_for :admin_users, ActiveAdmin::Devise.config
    ActiveAdmin.routes(self)
  end
end
get "/admin" => redirect("/")

namespace :api, defaults: { format: :json } do
  namespace :v1 do
    match 'social/:username/followers' => 'social#followers', via: :get
  end
end

scope :ujs, defaults: { format: :ujs } do
  patch 'invite' => 'ujs#invite'
end

In the routes when it routes “to” something it goes by “controller#method“.

Controllers

When a route is loaded it loads the controller that matches first.  The controller is responsible for whatever objects that need to be instantiated as variables for the view.  When a controller method is loaded it will either need to have an appropriate HTTP response, or if left without one it Rails will load a page by the same name in the views directory.  If neither are provided you will have an error on the website.

>> This is currently a fluctuating DRAFT VERSION <<

Leave a Reply

Your email address will not be published / Required fields are marked *