Rails 3
Application Setup
- create project with
rails new my_project rails -d mysql new my_project # if you don't want the default sqlite3
- add gem dependencies to
Gemfile
at the root level - update
config/application.rb
to load needed dependencies and update defaults - double-check
/config/initializers
and/config/environments
- edit
config/database.yml
to connect to your database
Notes
Files in lib/
are not automatically loaded, so you need to require
them.
In config/environments/development.rb
, set
config.action_mailer.perform_deliveries = false
No delivery attempt is performed, but you can still see the mail in the log file to check it looks good
Database Setup
- create database with
rake db:create
Create a table and its controller
rails generate model Article
Edit db/migrate/20100223220648_create_articles.rb
to look like this:
class CreateArticles < ActiveRecord::Migration def self.up create_table :articles do |t| t.string :title t.text :body t.datetime :published_at t.timestamps end end def self.down drop_table :articles end end
To create/update the table:
rake db:migrate
To generate the controller:
rails generate controller articles
Make a scaffold
To make a scaffold for the table to allow easy create/update/delete in development:
rails generate scaffold Article title:string body:text published_at:datetime --skip-migration
WARNING: As you develop your application, you will eventually replace most or even all of the code that the scaffold generates in the controller.
Update table and scaffold
To modify the table, generate a custom migration:
rails generate migration add_excerpt_and_location_to_articles excerpt:string location:string
creates this migration file db/migrate/20100223232337_add_excerpt_and_location_to_articles.rb
:
class AddExcerptAndLocationToArticles < ActiveRecord::Migration def self.up add_column :articles, :excerpt, :string add_column :articles, :location, :string end def self.down remove_column :articles, :excerpt remove_column :articles, :location end end
Run rake db:migrate
again to update the database.
Now update the scaffold:
rails generate scaffold Article title:string location:string excerpt:string body:text published_at:datetime --skip-migration
Add validations to the model
Edit app/models/article.rb
:
class Article < ActiveRecord::Base validates :title, :presence => true validates :body, :presence => true end
Other rails commands
rails console rails dbconsole rails server rails runner
Routing
Configured in config/routes.rb
match 'products/:id' => 'products#show'
The url http://localhost:3000/products/8
will be mapped to the show
action of the products
controller with params[:id]
set to 8
To create a link to this route (old way):
link_to "Products", :controller => "products", :action => "show", :id => 1
To restrict the HTTP method, use get or post instead of match:
get 'products/:id' => 'products#show'
To redirect:
match "/foo", :to => redirect("/bar")
Logging
Use these in models, views, controllers to send timestamped messages to the log.
logger.debug "debug message" logger.info "info message" logger.warn "something bad" logger.error "something broke" logger.fatal "application dead"
Active Record
Create and Save
article = Article.new # make an empty object article.title = "My Title" # add attributes article.author = "Herman" article.save # save to database
article.create(:title => "My Title", :author => "Herman") # make, set attributes, and save
article.new_record? # new means not saved to database
Find
Article.find(3) # look for id = 3
Article.first # same as Article.find(:first), uses "LIMIT 1" in SQL, so may not be id = 1
Article.last # same as Article.find(:last)
Article.all # same as Article.find(:all)
Article.where(:title => 'RailsConf').first # chaining
Article.find_by_title('RailsConf') # dynamic finder