rails intro & tutorial

Post on 09-May-2015

472 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

A rails introduction and tutorial course for FJU

TRANSCRIPT

Ruby On Rails Intro & Tutorial

Mason Chang

Saturday, April 13, 13

Who I am?

• Mason Chang (張銘軒)

• Works at OptimisDev

• twitter: @changmason

• github: https://github.com/changmason

Saturday, April 13, 13

Part I

Saturday, April 13, 13

What is Rails?

Saturday, April 13, 13

Rails is...

http://rubyonrails.org/

Saturday, April 13, 13

Rails is...

• Created by DHH of 37signals in 2004

• Extracted from product Basecamp

• Of course, written in Ruby

Saturday, April 13, 13

Rails Philosophy

Saturday, April 13, 13

Don't Repeat Yourself

• Code generators

• Rake tasks

• Extentions

Saturday, April 13, 13

Code generators

• Generate new project

• Generate models

• Generate controllers & views

Saturday, April 13, 13

Rake tasks

• Run tests

• Manipulate database

• Show useful info

Saturday, April 13, 13

Extensions

• Sensible core extensions

• Helper methods

• A lot of 3rd party gems

Saturday, April 13, 13

Convention over Configuration(1)

• Convention for environments development, test and production

• Convention for organizing code

• Convention for organizing assets

Saturday, April 13, 13

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

MVC Architecture

Saturday, April 13, 13

http://betterexplained.com/articles/intermediate-rails-understanding-models-views-and-controllers/

Saturday, April 13, 13

RESTful Routes

Saturday, April 13, 13

http://guides.rubyonrails.org/routing.html

Combine HTTP verb and path to dispatch requests to corresponding

handlers (actions)

Saturday, April 13, 13

A very simple blogin 5 minute

Saturday, April 13, 13

Part II

Saturday, April 13, 13

ActiveRecord & Model

Saturday, April 13, 13

What is ActiveRecord?

• ORM, Object-Relational Mapping

• Dealing with SQL

• A standalone Module

• Tons of functionalities

Saturday, April 13, 13

$ gem install activerecord $ irb

> require 'rubygems' > require 'active_record' > ActiveRecord::VERSION::STRING

Saturday, April 13, 13

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

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

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

User Model

> class User < ActiveRecord::Base end

> require 'logger'

> ActiveRecord::Base.logger = Logger.new(STDOUT)

Saturday, April 13, 13

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

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

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

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

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

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

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

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

Callbacks for destroying an object

• before_destroy

• around_destroy

• after_destroy

Saturday, April 13, 13

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

One-to-one association

Saturday, April 13, 13

One-to-many association

Saturday, April 13, 13

Many-to-many association

Saturday, April 13, 13

Part III

Saturday, April 13, 13

Task 0: Install Rails

Saturday, April 13, 13

$ gem install rails

$ rails --version

Saturday, April 13, 13

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

Task 1: New Project

Saturday, April 13, 13

$ rails new mylibrary --skip-test-unit

$ cd mylibrary/

$ rails server

$ rm public/index.html

Saturday, April 13, 13

Project Directory(1)

Saturday, April 13, 13

Project Directory(2)

Saturday, April 13, 13

Task 2: Install Some Gems & Import Specs

Saturday, April 13, 13

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

Task 3: Create Book Model

Saturday, April 13, 13

$ 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

Task 4: Pass the "Create" Book Spec

Saturday, April 13, 13

Task 5: Pass the "Retrieve" Book Spec

Saturday, April 13, 13

Task 6: Pass the "Update" Book Spec

Saturday, April 13, 13

Task 7: Pass the "Destroy" Book Spec

Saturday, April 13, 13

Task 8: Refactor Routes

Saturday, April 13, 13

Task 9: Refactor Views

Saturday, April 13, 13

Task 10: Scaffold the Category

Saturday, April 13, 13

$ rails generate model Category name:string

$ rake db:migrate

$ rails console

> Category.column_names

Saturday, April 13, 13

Task 11: Apply Models' Associations

Saturday, April 13, 13

class Category < ActiveRecord::Base

has_many :books

end

class Book < ActiveRecord::Base

belongs_to :category

end

Saturday, April 13, 13

$ rails generate migration add_category_id_to_books category_id:integer:index

$ rake db:migrate

Saturday, April 13, 13

Task 12: Validate Inputs

Saturday, April 13, 13

class Book < ActiveRecord::Base

belongs_to :category

validates_presence_of :category_id,

:author,

:title

end

Saturday, April 13, 13

Task 13: Decorate with Twitter Bootstrap

Saturday, April 13, 13

Task 14: Deploy to Heroku

Saturday, April 13, 13

Assignments

Saturday, April 13, 13

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

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

top related