Download - Rails Intro & Tutorial
![Page 1: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/1.jpg)
Ruby On Rails Intro & Tutorial
Mason Chang
Saturday, April 13, 13
![Page 2: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/2.jpg)
Who I am?
• Mason Chang (張銘軒)
• Works at OptimisDev
• twitter: @changmason
• github: https://github.com/changmason
Saturday, April 13, 13
![Page 3: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/3.jpg)
Part I
Saturday, April 13, 13
![Page 4: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/4.jpg)
What is Rails?
Saturday, April 13, 13
![Page 5: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/5.jpg)
Rails is...
http://rubyonrails.org/
Saturday, April 13, 13
![Page 6: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/6.jpg)
Rails is...
• Created by DHH of 37signals in 2004
• Extracted from product Basecamp
• Of course, written in Ruby
Saturday, April 13, 13
![Page 7: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/7.jpg)
Rails Philosophy
Saturday, April 13, 13
![Page 8: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/8.jpg)
Don't Repeat Yourself
• Code generators
• Rake tasks
• Extentions
Saturday, April 13, 13
![Page 9: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/9.jpg)
Code generators
• Generate new project
• Generate models
• Generate controllers & views
Saturday, April 13, 13
![Page 10: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/10.jpg)
Rake tasks
• Run tests
• Manipulate database
• Show useful info
Saturday, April 13, 13
![Page 11: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/11.jpg)
Extensions
• Sensible core extensions
• Helper methods
• A lot of 3rd party gems
Saturday, April 13, 13
![Page 12: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/12.jpg)
Convention over Configuration(1)
• Convention for environments development, test and production
• Convention for organizing code
• Convention for organizing assets
Saturday, April 13, 13
![Page 13: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/13.jpg)
Convention over Configuration(2)
• Convention for models model names - table names model attributes - record fields
• Convention for controllers & views controller actions - view templates
Saturday, April 13, 13
![Page 14: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/14.jpg)
MVC Architecture
Saturday, April 13, 13
![Page 15: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/15.jpg)
http://betterexplained.com/articles/intermediate-rails-understanding-models-views-and-controllers/
Saturday, April 13, 13
![Page 16: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/16.jpg)
RESTful Routes
Saturday, April 13, 13
![Page 17: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/17.jpg)
http://guides.rubyonrails.org/routing.html
Combine HTTP verb and path to dispatch requests to corresponding
handlers (actions)
Saturday, April 13, 13
![Page 18: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/18.jpg)
A very simple blogin 5 minute
Saturday, April 13, 13
![Page 19: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/19.jpg)
Part II
Saturday, April 13, 13
![Page 20: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/20.jpg)
ActiveRecord & Model
Saturday, April 13, 13
![Page 21: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/21.jpg)
What is ActiveRecord?
• ORM, Object-Relational Mapping
• Dealing with SQL
• A standalone Module
• Tons of functionalities
Saturday, April 13, 13
![Page 22: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/22.jpg)
$ gem install activerecord $ irb
> require 'rubygems' > require 'active_record' > ActiveRecord::VERSION::STRING
Saturday, April 13, 13
![Page 23: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/23.jpg)
ActiveRecord can connect to existing DB
> ActiveRecord::Base.establish_connection( :adapter => 'mysql2', :database => 'fju_test_db', :username => 'root', :password => '******' )
> ActiveRecord::Base.connection
> ActiveRecord::Base.connected?
Saturday, April 13, 13
![Page 24: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/24.jpg)
ActiveRecord can migrate existing DB
> ARConnection = AR::Base.connection
> ARConnection.create_table(:users) do |t| t.string :name t.integer :age t.timestamps end
> ARConnection.add_index(:users, 'name')
Saturday, April 13, 13
![Page 25: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/25.jpg)
ActiveRecord can execute raw SQL
> ARConnection = AR::Base.connection
> ARConnection.execute(%q{ INSERT INTO users (name, age) VALUES ('Mason Chang', 30) })
> resultes = ARConnection.execute(%q{ SELECT * FROM users WHERE age = 30 })> results.fields> results.first
Saturday, April 13, 13
![Page 26: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/26.jpg)
User Model
> class User < ActiveRecord::Base end
> require 'logger'
> ActiveRecord::Base.logger = Logger.new(STDOUT)
Saturday, April 13, 13
![Page 27: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/27.jpg)
Model can create records
> user.newser = User.new( :name => 'Eddie Kao', :age => 20)> user.save
> User.create( :name => 'Ryudo Teng', :age => 20)
Saturday, April 13, 13
![Page 28: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/28.jpg)
Model can retrieve records
> User.first
> User.last
> User.all
> User.find(1)
> User.find([1,2,3])
> User.find(:first, :conditions => {:name => 'Eddie Kao'})
> User.find(:all, :conditions => ['age < ?', 30])
Saturday, April 13, 13
![Page 29: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/29.jpg)
Model can update records
> user = User.find_by_name('Mason Chang')> user.age = 10> user.save
> user.update_attribute(:age, 20)
> user.update_attributes( :name => 'Ming-hsuan Chang' :age => 30)
> User.update(1, :age => 40)
> User.update_all( {:age => 50}, ['age >= ?', 20])
Saturday, April 13, 13
![Page 30: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/30.jpg)
Model can delete records
> user = User.first
> user.delete # callbacks ignored
> user.destroy # callbacks triggered
> User.delete(1) # callbacks ignored
> User.destroy(1) # callbacks triggered
Saturday, April 13, 13
![Page 31: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/31.jpg)
Model can do validations
> class User validates_presence_of :name validates_numericality_of :age end
> user = User.new(:age => 'thirty")
> user.save # fail
> user.errors.messages
http://guides.rubyonrails.org/active_record_validations_callbacks.html
Saturday, April 13, 13
![Page 32: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/32.jpg)
Model can have callbacks
• Callbacks are operations which hooked into the lifecycle of an ActiveRecord object
• Object's lifecycle includes: creating, updating and destroying an object after initializing and finding an object
http://guides.rubyonrails.org/active_record_validations_callbacks.html
Saturday, April 13, 13
![Page 33: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/33.jpg)
Callbacks for creating an object
• before_validation
• after_validation
• before_save
• around_save
• before_create
• around_create
• after_create
• after_save
Saturday, April 13, 13
![Page 34: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/34.jpg)
Callbacks for updating an object
• before_validation
• after_validation
• before_save
• around_save
• before_update
• around_update
• after_update
• after_save
Saturday, April 13, 13
![Page 35: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/35.jpg)
Callbacks for destroying an object
• before_destroy
• around_destroy
• after_destroy
Saturday, April 13, 13
![Page 36: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/36.jpg)
Model can have associations
• One-to-one
• One-to-many
• Many-to-many
• and more...
http://guides.rubyonrails.org/association_basics.html
Saturday, April 13, 13
![Page 37: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/37.jpg)
One-to-one association
Saturday, April 13, 13
![Page 38: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/38.jpg)
One-to-many association
Saturday, April 13, 13
![Page 39: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/39.jpg)
Many-to-many association
Saturday, April 13, 13
![Page 40: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/40.jpg)
Part III
Saturday, April 13, 13
![Page 41: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/41.jpg)
Task 0: Install Rails
Saturday, April 13, 13
![Page 42: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/42.jpg)
$ gem install rails
$ rails --version
Saturday, April 13, 13
![Page 43: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/43.jpg)
The rails command• create new project
> rails new [project_name]
• start server > rails server
• start console > rails console
• execute generator > rails generate [generator_type]
• more, and get help > rails help [command]
Saturday, April 13, 13
![Page 44: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/44.jpg)
Task 1: New Project
Saturday, April 13, 13
![Page 45: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/45.jpg)
$ rails new mylibrary --skip-test-unit
$ cd mylibrary/
$ rails server
$ rm public/index.html
Saturday, April 13, 13
![Page 46: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/46.jpg)
Project Directory(1)
Saturday, April 13, 13
![Page 47: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/47.jpg)
Project Directory(2)
Saturday, April 13, 13
![Page 48: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/48.jpg)
Task 2: Install Some Gems & Import Specs
Saturday, April 13, 13
![Page 49: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/49.jpg)
Gemfile: add haml-rails gem
$ bundle install
Gemfile: add rspec-rails
Gemfile: add capybara
$ bundle install
$ rails generate rspec:install
spec/spec_helper.rb: require 'capybara-rails'
Saturday, April 13, 13
![Page 50: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/50.jpg)
Task 3: Create Book Model
Saturday, April 13, 13
![Page 51: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/51.jpg)
$ rails generate model Book author:string title:string description:text publish_date:date
$ rake db:migrate
$ rails console
> Book.column_names
Saturday, April 13, 13
![Page 52: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/52.jpg)
Task 4: Pass the "Create" Book Spec
Saturday, April 13, 13
![Page 53: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/53.jpg)
Task 5: Pass the "Retrieve" Book Spec
Saturday, April 13, 13
![Page 54: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/54.jpg)
Task 6: Pass the "Update" Book Spec
Saturday, April 13, 13
![Page 55: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/55.jpg)
Task 7: Pass the "Destroy" Book Spec
Saturday, April 13, 13
![Page 56: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/56.jpg)
Task 8: Refactor Routes
Saturday, April 13, 13
![Page 57: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/57.jpg)
Task 9: Refactor Views
Saturday, April 13, 13
![Page 58: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/58.jpg)
Task 10: Scaffold the Category
Saturday, April 13, 13
![Page 59: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/59.jpg)
$ rails generate model Category name:string
$ rake db:migrate
$ rails console
> Category.column_names
Saturday, April 13, 13
![Page 60: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/60.jpg)
Task 11: Apply Models' Associations
Saturday, April 13, 13
![Page 61: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/61.jpg)
class Category < ActiveRecord::Base
has_many :books
end
class Book < ActiveRecord::Base
belongs_to :category
end
Saturday, April 13, 13
![Page 62: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/62.jpg)
$ rails generate migration add_category_id_to_books category_id:integer:index
$ rake db:migrate
Saturday, April 13, 13
![Page 63: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/63.jpg)
Task 12: Validate Inputs
Saturday, April 13, 13
![Page 64: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/64.jpg)
class Book < ActiveRecord::Base
belongs_to :category
validates_presence_of :category_id,
:author,
:title
end
Saturday, April 13, 13
![Page 65: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/65.jpg)
Task 13: Decorate with Twitter Bootstrap
Saturday, April 13, 13
![Page 66: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/66.jpg)
Task 14: Deploy to Heroku
Saturday, April 13, 13
![Page 67: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/67.jpg)
Assignments
Saturday, April 13, 13
![Page 68: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/68.jpg)
Assignment 1: Add a search bar above the book list table on the index page, so the user can search for books by author name or by book title.
Saturday, April 13, 13
![Page 69: Rails Intro & Tutorial](https://reader034.vdocuments.site/reader034/viewer/2022042814/554dad89b4c905ff7a8b4fa8/html5/thumbnails/69.jpg)
Assignment 2: Add pagination links below the book list table on the index page, so the user can browse through 20 books per page.
Saturday, April 13, 13