SlideShare una empresa de Scribd logo
1 de 76
Ruby on Rials
  The Rails Way 1
Rails ≠ Ruby
Ruby on Rails Principes
Thick models, thin
controllers & thin views
 Views houden zich bezig met het tonen van
 data

 Controllers bepalen welke functies er per
 request op het model worden aangeroepen

 Models bevatten alle business logica (CRUD,
 validaties, scopes, find)
Convention over
 Configuration
Convention over
         Configuration
Model BlogComment
Convention over
          Configuration
Model BlogComment
staat in app/models/blog_comment.rb
Convention over
          Configuration
Model BlogComment
staat in app/models/blog_comment.rb
heeft een tabelnaam blog_comments
Convention over
           Configuration
Model BlogComment
 staat in app/models/blog_comment.rb
 heeft een tabelnaam blog_comments

Controller ArchiveController
Convention over
            Configuration
Model BlogComment
 staat in app/models/blog_comment.rb
 heeft een tabelnaam blog_comments

Controller ArchiveController
 staat in app/controllers/archive_controller.rb
Convention over
            Configuration
Model BlogComment
 staat in app/models/blog_comment.rb
 heeft een tabelnaam blog_comments

Controller ArchiveController
 staat in app/controllers/archive_controller.rb
 views staan in app/views/archive
DRY: Don’t Repeat
    Yourself
DRY: Don’t Repeat
    Yourself

 Gebruik partials in views
DRY: Don’t Repeat
    Yourself

 Gebruik partials in views
 Gebruik filters in controllers
Models: ActiveRecord


ActiveRecord is verantwoordelijk voor alle
datagerelateerde processen

Object/Relationship Mapping (ORM) data in
de database wordt gemapt naar een classe in
de applicatie
Controllers:
    ActionController

ActionController is verantwoordelijk voor de
afhandeling van user requests

Faciliteert de communicatie tussen het model
en de view
Views: ActionView


ActionView is verantwoordelijk voor het
tonen van (delen van) pagina’s

Maakt gebruik van een template systeem

vb: .html.erb .xml.erb .js.erb
REST


Representation State Transfer

Gebruikt HTTP (Get, Post, Put, Delete) voor
CRUD acties

routes.rb definieert restfull resources
Ruby on Rails Tools
command line
rails console

rails server

rake

rails generate

rails dbconsole

rails new app_name
Generators
Generators
> rails generate model MyModel title:string body:text
Generators
> rails generate model MyModel title:string body:text
 invoke active_record
 create   db/migrate/20120618141106_create_my_models.rb
 create   app/models/my_model.rb
 invoke test_unit
 create   test/unit/my_model_test.rb
 create   test/fixtures/my_models.yml
Generators
> rails generate model MyModel title:string body:text     > rails generate controller home index
 invoke active_record
 create   db/migrate/20120618141106_create_my_models.rb
 create   app/models/my_model.rb
 invoke test_unit
 create   test/unit/my_model_test.rb
 create   test/fixtures/my_models.yml
Generators
> rails generate model MyModel title:string body:text     > rails generate controller home index
 invoke active_record                                      create app/controllers/home_controller.rb
 create   db/migrate/20120618141106_create_my_models.rb    route get "home/index"
 create   app/models/my_model.rb                           invoke erb
 invoke test_unit                                          create   app/views/home
 create   test/unit/my_model_test.rb                       create   app/views/home/index.html.erb
 create   test/fixtures/my_models.yml                       invoke test_unit
                                                           create   test/functional/home_controller_test.rb
                                                           invoke helper
                                                           create   app/helpers/home_helper.rb
                                                           invoke   test_unit
                                                           create     test/unit/helpers/home_helper_test.rb
                                                           invoke assets
                                                           invoke   coffee
                                                           create     app/assets/javascripts/home.js.coffee
                                                           invoke   scss
                                                           create     app/assets/stylesheets/home.css.scss
migrations
migrations
> rails generate migration CreateProducts
migrations
> rails generate migration CreateProducts
  class CreateProducts < ActiveRecord::Migration
    def up
    end
   
    def down
    end
  end
migrations
> rails generate migration CreateProducts
  class CreateProducts < ActiveRecord::Migration
    def up
      create_table :products do |t|
        t.string :name
        t.text :description
   
        t.timestamps
      end
    end
   
    def down
      drop_table :products
    end
  end
TDD / BDD

Schrijf een test die faalt en schrijf daarna
code om de test te laten slagen

Het geeft inzicht in wat de code moet doen
voordat deze geschreven wordt

TDD test afzonderlijke units

BDD test interactie tussen de units
ActiveSupport::TestCase
   require 'test_helper'
    
   class PostTest < ActiveSupport::TestCase
     test "should not save product without title" do
      product = Product.new
      assert !product.save
     end
   end


   class Product < ActiveRecord::Base
     validates :title, :presence => true
   end
ActionController::TestCase
    require ‘test_helper’

    test "should create post" do
      assert_difference('Post.count') do
        post :create, :post => { :title => 'Hi', :body => 'This is my first post.'}
      end
      assert_redirected_to post_path(assigns(:post))
      assert_equal 'Post was successfully created.', flash[:notice]
    end
ActionDispatch::IntegrationTest
   require 'test_helper'
    
   class UserFlowsTest < ActionDispatch::IntegrationTest
     fixtures :users
    
     test "login and browse site" do
       # login via https
       https!
       get "/login"
       assert_response :success
    
       post_via_redirect "/login", :username => users(:avs).username, :password => users(:avs).password
       assert_equal '/welcome', path
       assert_equal 'Welcome avs!', flash[:notice]
    
       https!(false)
       get "/posts/all"
       assert_response :success
       assert assigns(:products)
     end
   end
Een Rails Applicatie
Een Rails Applicatie


gem install rails

gem install bundler

rails new dit_wil_ik --database mysql
Gemfile


1 plaats voor al je gem dependencies

Gemfile.lock houdt de versies bij en hoort in
Git te staan
Bundler


bundle install

bundle update

bundle update mijn_gem
Database config
config/database.yml

HOORT NIET IN GIT!!!!

rake db:create

rake db:migrate

rake db:rollback

rake db:rollback STEP=3

rake db:migrate:redo STEP=3
http://jonathanhui.com/
       ruby-rails-3
Models
> rails generate model product title:string description:text url:string rating:integer

invoke active_record
create   db/migrate/20120619094230_create_products.rb
create   app/models/product.rb
invoke test_unit
create   test/unit/product_test.rb
create   test/fixtures/products.yml
Models
Migration                                        Model
class CreateProducts < ActiveRecord::Migration   class Product < ActiveRecord::Base
  def change                                       attr_accessible :description, :rating, :title, :url
    create_table :products do |t|                end
      t.string :title
      t.text :description

                                                 Test
      t.string :url
      t.integer :rating
                                                 require 'test_helper'
    t.timestamps
   end                                           class ProductTest < ActiveSupport::TestCase
 end                                               # test "the truth" do
end                                                # assert true
                                                   # end
                                                 end
Models
class Product < ActiveRecord::Base
  attr_accessible :description, :rating, :title, :url

 validate :title, :presence => true
end



require 'test_helper'

class ProductTest < ActiveSupport::TestCase
  test "should not save product without title" do
    product = Product.new
    assert !product.save
  end
end
Assosiations
Assosiations

belongs_to object bevat id van de relatie

has_one de relatie bevat id van object

has_many de relatie bevat id van object

has_and_belongs_to many-to-many relatie
met tussentabel
Models
> rails generate model user name:string
invoke active_record
create   db/migrate/20120619103822_create_users.rb
create   app/models/user.rb
invoke test_unit
create   test/unit/user_test.rb
create   test/fixtures/users.yml



> rails generate migration AddUserIdToProducts

invoke active_record
create   db/migrate/20120619103714_add_user_id_to_products.rb
Models
class AddUserIdToProducts < ActiveRecord::Migration
  def change
    add_column :products, :user_id, :integer
  end
end

class Product < ActiveRecord::Base
  attr_accessible :description, :rating, :title, :url
  belong_to :user

 validate :title, :presence => true
end


class User < ActiveRecord::Base
  attr_accessible :name

 has_many :products
end
Models
p = Product.create :title => “Boek”
u = User.create :name => “Rupert Vliegje”
p.user = u
p.save

u.products.create => “Pizza”
Scopes
Scopes
class Product < ActiveRecord::Base
  attr_accessible :description, :rating, :title, :url

 belongs_to :user

 scope :ordered, order(:title)
 scope :rated, lambda{|rating| where("rating >= ?", rating)}

 validates :title, :presence => true
end
Scopes
Product.rated(3)
Product.ordered

Product.rated(3).ordered
Polymorphic...
Polimorphic


Een model kan tot meerdere modellen
behoren binnen dezelfde assosiatie.

Bijvoorbeeld een plaatje dat bij een product
of een user hoort
Polymorphic
class Picture < ActiveRecord::Base
  belongs_to :imageable, :polymorphic => true
end
 
class Product < ActiveRecord::Base
  attr_accessible :description, :rating, :title, :url
  belong_to :user
  has_many :pictures, :as => :imageable

 scope :ordered, order(:title)
 scope :rated, lambda{|rating| where("rating >= ?", rating)}

  validate :title, :presence => true
end
 
class User < ActiveRecord::Base
  attr_accessible :name
  has_many :products
  has_many :pictures, :as => :imageable
end
Polymorphic
class CreatePictures < ActiveRecord::Migration
  def change
    create_table :pictures do |t|
      t.string  :name
      t.integer :imageable_id
      t.string  :imageable_type
      t.timestamps
    end
  end
end

class CreatePictures < ActiveRecord::Migration
  def change
    create_table :pictures do |t|
      t.string :name
      t.references :imageable, :polymorphic => true
      t.timestamps
    end
  end
end
Polymorphic
 u = User.first
 u.pictures.create :name => "foto"

 p = Product.first
 p.pictures.create :name => "plaatje"
Controllers
Controllers
> rails generate controller Products index show

 create app/controllers/products_controller.rb
 route get "products/show"
 route get "products/index"
 invoke erb
 create   app/views/products
 create   app/views/products/index.html.erb
 create   app/views/products/show.html.erb
 invoke test_unit
 create   test/functional/products_controller_test.rb
 invoke helper
 create   app/helpers/products_helper.rb
 invoke   test_unit
 create     test/unit/helpers/products_helper_test.rb
 invoke assets
 invoke   coffee
 create     app/assets/javascripts/products.js.coffee
 invoke   scss
 create     app/assets/stylesheets/products.css.scss
Controllers
class ProductsController < ApplicationController
  def index
  end

 def show
 end
end
Controllers
class ProductsController < ApplicationController
  def index
    @products = Product.ordered
  end

 def show
   @product = Product.find_by_id(params[:id])
 end
end
Views
app/views/products/index.html.erb
     <h1>Products#index</h1>
     <p>Find me in app/views/products/index.html.erb</p>




app/views/products/show.html.erb
     <h1>Products#show</h1>
     <p>Find me in app/views/products/show.html.erb</p>
Views
    app/views/products/index.html.erb
                           <h1>Products</h1>
                           <% @products.each do |p| %>
                             <p><%= link_to p.title, p %></p>
                           <% end %>




    app/views/products/show.html.erb
<h1><%= @product.title %></h1>
<p><%= @product.description.present? ? "#{@product.descirption}" : "Geen beschrijving"
%></p>
<p><%= @product.rating.present? ? "#{@product.rating}" : "Geen rating" %></p>

<p><%= link_to "<< Overzicht", products_path %></p>
Routing

config/routes.rb
DitWilIk::Application.routes.draw do
  resources :products, :only => [:index, :show]
end
Routing

config/routes.rb
DitWilIk::Application.routes.draw do
  resources :products, :only => [:index, :show]
end



rake routes
Routing

config/routes.rb
DitWilIk::Application.routes.draw do
  resources :products, :only => [:index, :show]
end



rake routes
products GET /products(.:format)             products#index
product GET /products/:id(.:format)          products#show
En dan
Cookie, Session & Flash
Cookies
# Retrieve cookie with name "uid"
u_name = cookies[:uid]

# Set cookie
cookies[:uid] = u_name

# Delete a cookie
cookies.delete(:uid)
Sessions
session[:user_id] = user.id # sessie opslaan

@my_user ||= session[:user_id] && User.find_by_id(session[:user_id])

session[:user_id] = nil # sessie verwijderen

reset_session # Sessie resetten
Flash
flash[:notice] = “Alles is OK!”

<%= flash[:notice] if flash[:notice].present? %>

redirect_to products_path, :notice => “Product is opgeslagen”

flash[:notice].now = “Blijft alleen bewaard voor dit request (AJAX)”

flash[:notice].keep = “Blijft bewaard voor volgend request”
Forms

Rails kent geen Form objecten

Forms staan gewoon in views

Alle validaties horen in het Model

Het Form interacteert met de Controller

De Controller met het Model
Forms
                              # Forms voor resources
                              <%= form_for(@product) do |f| %>
                               <%= f.label :title %>
                               <%= f.text_field :title %>
                               <%= f.submit “Opslaan”
                              <% end %>




# Onafhankelijk formulier
<%= form_tag({:controller => "people", :action => "search"}, :method => "get", :class => "nifty_form") %>
 <p>value:<%= text_field_tag(:search) %></p>
 <%= submit_tag 'Zoeken' %>
<% end %>
En nu?
En nu?
railsforzombies.org
En nu?
        railsforzombies.org

rails new dit_wil_ik --database mysql
En nu?
                        railsforzombies.org

          rails new dit_wil_ik --database mysql
Verlanglijstje
- Gebruiker kan   zich registreren
- Gebruiker kan   producten toevoegen die hij graag zou willen hebben
- Gebruiker kan   een rating aan een product geven
- Gebruiker kan   een link naar betreffende webshop aan een producten toevoegen
- Gebruiker kan   een plaatje aan een product toevoegen
- Gebruiker kan   bij een product een feestgelegenheid toevoegen
- Gebruiker kan   een toegevoegd product wijzigen en verwijderen
- Gebruiker kan   feestgelegenheden toevoegen, wijzigen en verwijderen
- Gebruiker kan   een overzicht van zijn lijst op het scherm zien
- Gebruiker kan   het overzicht van zijn lijst emailen
- ...
En nu?
                        railsforzombies.org

          rails new dit_wil_ik --database mysql

            Demo: 5 juli
Verlanglijstje
- Gebruiker kan
- Gebruiker kan
                  zich registreren
                  producten toevoegen die hij graag zou willen hebben
- Gebruiker kan   een rating aan een product geven
- Gebruiker kan   een link naar betreffende webshop aan een producten toevoegen
- Gebruiker kan   een plaatje aan een product toevoegen
- Gebruiker kan   bij een product een feestgelegenheid toevoegen
- Gebruiker kan   een toegevoegd product wijzigen en verwijderen
- Gebruiker kan   feestgelegenheden toevoegen, wijzigen en verwijderen
- Gebruiker kan   een overzicht van zijn lijst op het scherm zien
- Gebruiker kan   het overzicht van zijn lijst emailen
- ...

Más contenido relacionado

Similar a The Rails way

Magento cursus: theme opzetten & beheren
Magento cursus: theme opzetten & beherenMagento cursus: theme opzetten & beheren
Magento cursus: theme opzetten & beherenMichel Doens
 
Lucius Drupal Development Cursus
Lucius Drupal Development CursusLucius Drupal Development Cursus
Lucius Drupal Development CursusLuciuswebsystems
 
Object Oriented Programming for web applications
Object Oriented Programming for web applicationsObject Oriented Programming for web applications
Object Oriented Programming for web applicationsEdwin Vlieg
 
Demo Juwelier applicatie
Demo Juwelier applicatieDemo Juwelier applicatie
Demo Juwelier applicatiedd354
 
Flex In De Praktijk
Flex In De PraktijkFlex In De Praktijk
Flex In De Praktijkmarcel panse
 
Drupal Uitgebreide Starters Training
Drupal Uitgebreide Starters TrainingDrupal Uitgebreide Starters Training
Drupal Uitgebreide Starters TrainingLuciuswebsystems
 
Cursus Zend Framework - 1
Cursus Zend Framework - 1Cursus Zend Framework - 1
Cursus Zend Framework - 1bartjeukendrup
 
PFZ Workshop - Automatiseren van functionele tests
PFZ Workshop - Automatiseren van functionele testsPFZ Workshop - Automatiseren van functionele tests
PFZ Workshop - Automatiseren van functionele testsRichard Tuin
 
XPages Introductie
XPages IntroductieXPages Introductie
XPages IntroductieRob Bontekoe
 
Template overrides - Joomladagen 2010 #jd10nl
Template overrides - Joomladagen 2010 #jd10nlTemplate overrides - Joomladagen 2010 #jd10nl
Template overrides - Joomladagen 2010 #jd10nlSander Potjer
 
Magento webwinkel starten & optimaliseren
Magento webwinkel starten & optimaliserenMagento webwinkel starten & optimaliseren
Magento webwinkel starten & optimaliserenMichel Doens
 
Sql developer 4 workshop
Sql developer 4 workshopSql developer 4 workshop
Sql developer 4 workshopmakker_nl
 
Zo maak je een WordPress site succesvol - WordCamp Nederland 2012
Zo maak je een WordPress site succesvol - WordCamp Nederland 2012Zo maak je een WordPress site succesvol - WordCamp Nederland 2012
Zo maak je een WordPress site succesvol - WordCamp Nederland 2012Webmonnik.nl
 
Presentatie WordPress Theme Frameworks WordCamp NL 2010
Presentatie WordPress Theme Frameworks WordCamp NL 2010Presentatie WordPress Theme Frameworks WordCamp NL 2010
Presentatie WordPress Theme Frameworks WordCamp NL 2010Remkus de Vries
 
de Rules module van Drupal
de Rules module van Drupalde Rules module van Drupal
de Rules module van Drupaldropsolid
 

Similar a The Rails way (20)

Magento cursus: theme opzetten & beheren
Magento cursus: theme opzetten & beherenMagento cursus: theme opzetten & beheren
Magento cursus: theme opzetten & beheren
 
Lucius Drupal Development Cursus
Lucius Drupal Development CursusLucius Drupal Development Cursus
Lucius Drupal Development Cursus
 
Object Oriented Programming for web applications
Object Oriented Programming for web applicationsObject Oriented Programming for web applications
Object Oriented Programming for web applications
 
Demo Juwelier applicatie
Demo Juwelier applicatieDemo Juwelier applicatie
Demo Juwelier applicatie
 
Flex In De Praktijk
Flex In De PraktijkFlex In De Praktijk
Flex In De Praktijk
 
Drupal Uitgebreide Starters Training
Drupal Uitgebreide Starters TrainingDrupal Uitgebreide Starters Training
Drupal Uitgebreide Starters Training
 
Cursus Zend Framework - 1
Cursus Zend Framework - 1Cursus Zend Framework - 1
Cursus Zend Framework - 1
 
Integratiefase
IntegratiefaseIntegratiefase
Integratiefase
 
Integratiefase
IntegratiefaseIntegratiefase
Integratiefase
 
PFZ Workshop - Automatiseren van functionele tests
PFZ Workshop - Automatiseren van functionele testsPFZ Workshop - Automatiseren van functionele tests
PFZ Workshop - Automatiseren van functionele tests
 
Automated testing with SpecFlow
Automated testing with SpecFlowAutomated testing with SpecFlow
Automated testing with SpecFlow
 
Cooking Cake
Cooking CakeCooking Cake
Cooking Cake
 
Performance Testing
Performance TestingPerformance Testing
Performance Testing
 
XPages Introductie
XPages IntroductieXPages Introductie
XPages Introductie
 
Template overrides - Joomladagen 2010 #jd10nl
Template overrides - Joomladagen 2010 #jd10nlTemplate overrides - Joomladagen 2010 #jd10nl
Template overrides - Joomladagen 2010 #jd10nl
 
Magento webwinkel starten & optimaliseren
Magento webwinkel starten & optimaliserenMagento webwinkel starten & optimaliseren
Magento webwinkel starten & optimaliseren
 
Sql developer 4 workshop
Sql developer 4 workshopSql developer 4 workshop
Sql developer 4 workshop
 
Zo maak je een WordPress site succesvol - WordCamp Nederland 2012
Zo maak je een WordPress site succesvol - WordCamp Nederland 2012Zo maak je een WordPress site succesvol - WordCamp Nederland 2012
Zo maak je een WordPress site succesvol - WordCamp Nederland 2012
 
Presentatie WordPress Theme Frameworks WordCamp NL 2010
Presentatie WordPress Theme Frameworks WordCamp NL 2010Presentatie WordPress Theme Frameworks WordCamp NL 2010
Presentatie WordPress Theme Frameworks WordCamp NL 2010
 
de Rules module van Drupal
de Rules module van Drupalde Rules module van Drupal
de Rules module van Drupal
 

The Rails way

  • 1. Ruby on Rials The Rails Way 1
  • 3. Ruby on Rails Principes
  • 4. Thick models, thin controllers & thin views Views houden zich bezig met het tonen van data Controllers bepalen welke functies er per request op het model worden aangeroepen Models bevatten alle business logica (CRUD, validaties, scopes, find)
  • 6. Convention over Configuration Model BlogComment
  • 7. Convention over Configuration Model BlogComment staat in app/models/blog_comment.rb
  • 8. Convention over Configuration Model BlogComment staat in app/models/blog_comment.rb heeft een tabelnaam blog_comments
  • 9. Convention over Configuration Model BlogComment staat in app/models/blog_comment.rb heeft een tabelnaam blog_comments Controller ArchiveController
  • 10. Convention over Configuration Model BlogComment staat in app/models/blog_comment.rb heeft een tabelnaam blog_comments Controller ArchiveController staat in app/controllers/archive_controller.rb
  • 11. Convention over Configuration Model BlogComment staat in app/models/blog_comment.rb heeft een tabelnaam blog_comments Controller ArchiveController staat in app/controllers/archive_controller.rb views staan in app/views/archive
  • 13. DRY: Don’t Repeat Yourself Gebruik partials in views
  • 14. DRY: Don’t Repeat Yourself Gebruik partials in views Gebruik filters in controllers
  • 15. Models: ActiveRecord ActiveRecord is verantwoordelijk voor alle datagerelateerde processen Object/Relationship Mapping (ORM) data in de database wordt gemapt naar een classe in de applicatie
  • 16. Controllers: ActionController ActionController is verantwoordelijk voor de afhandeling van user requests Faciliteert de communicatie tussen het model en de view
  • 17. Views: ActionView ActionView is verantwoordelijk voor het tonen van (delen van) pagina’s Maakt gebruik van een template systeem vb: .html.erb .xml.erb .js.erb
  • 18. REST Representation State Transfer Gebruikt HTTP (Get, Post, Put, Delete) voor CRUD acties routes.rb definieert restfull resources
  • 19. Ruby on Rails Tools
  • 20. command line rails console rails server rake rails generate rails dbconsole rails new app_name
  • 22. Generators > rails generate model MyModel title:string body:text
  • 23. Generators > rails generate model MyModel title:string body:text invoke active_record create db/migrate/20120618141106_create_my_models.rb create app/models/my_model.rb invoke test_unit create test/unit/my_model_test.rb create test/fixtures/my_models.yml
  • 24. Generators > rails generate model MyModel title:string body:text > rails generate controller home index invoke active_record create db/migrate/20120618141106_create_my_models.rb create app/models/my_model.rb invoke test_unit create test/unit/my_model_test.rb create test/fixtures/my_models.yml
  • 25. Generators > rails generate model MyModel title:string body:text > rails generate controller home index invoke active_record create app/controllers/home_controller.rb create db/migrate/20120618141106_create_my_models.rb route get "home/index" create app/models/my_model.rb invoke erb invoke test_unit create app/views/home create test/unit/my_model_test.rb create app/views/home/index.html.erb create test/fixtures/my_models.yml invoke test_unit create test/functional/home_controller_test.rb invoke helper create app/helpers/home_helper.rb invoke test_unit create test/unit/helpers/home_helper_test.rb invoke assets invoke coffee create app/assets/javascripts/home.js.coffee invoke scss create app/assets/stylesheets/home.css.scss
  • 27. migrations > rails generate migration CreateProducts
  • 28. migrations > rails generate migration CreateProducts class CreateProducts < ActiveRecord::Migration   def up   end     def down   end end
  • 29. migrations > rails generate migration CreateProducts class CreateProducts < ActiveRecord::Migration   def up     create_table :products do |t|       t.string :name       t.text :description         t.timestamps     end   end     def down     drop_table :products   end end
  • 30. TDD / BDD Schrijf een test die faalt en schrijf daarna code om de test te laten slagen Het geeft inzicht in wat de code moet doen voordat deze geschreven wordt TDD test afzonderlijke units BDD test interactie tussen de units
  • 31. ActiveSupport::TestCase require 'test_helper'   class PostTest < ActiveSupport::TestCase test "should not save product without title" do    product = Product.new    assert !product.save end end class Product < ActiveRecord::Base   validates :title, :presence => true end
  • 32. ActionController::TestCase require ‘test_helper’ test "should create post" do   assert_difference('Post.count') do     post :create, :post => { :title => 'Hi', :body => 'This is my first post.'}   end   assert_redirected_to post_path(assigns(:post))   assert_equal 'Post was successfully created.', flash[:notice] end
  • 33. ActionDispatch::IntegrationTest require 'test_helper'   class UserFlowsTest < ActionDispatch::IntegrationTest   fixtures :users     test "login and browse site" do     # login via https     https!     get "/login"     assert_response :success       post_via_redirect "/login", :username => users(:avs).username, :password => users(:avs).password     assert_equal '/welcome', path     assert_equal 'Welcome avs!', flash[:notice]       https!(false)     get "/posts/all"     assert_response :success     assert assigns(:products)   end end
  • 35. Een Rails Applicatie gem install rails gem install bundler rails new dit_wil_ik --database mysql
  • 36. Gemfile 1 plaats voor al je gem dependencies Gemfile.lock houdt de versies bij en hoort in Git te staan
  • 38. Database config config/database.yml HOORT NIET IN GIT!!!! rake db:create rake db:migrate rake db:rollback rake db:rollback STEP=3 rake db:migrate:redo STEP=3
  • 39. http://jonathanhui.com/ ruby-rails-3
  • 40. Models > rails generate model product title:string description:text url:string rating:integer invoke active_record create db/migrate/20120619094230_create_products.rb create app/models/product.rb invoke test_unit create test/unit/product_test.rb create test/fixtures/products.yml
  • 41. Models Migration Model class CreateProducts < ActiveRecord::Migration class Product < ActiveRecord::Base def change attr_accessible :description, :rating, :title, :url create_table :products do |t| end t.string :title t.text :description Test t.string :url t.integer :rating require 'test_helper' t.timestamps end class ProductTest < ActiveSupport::TestCase end # test "the truth" do end # assert true # end end
  • 42. Models class Product < ActiveRecord::Base attr_accessible :description, :rating, :title, :url validate :title, :presence => true end require 'test_helper' class ProductTest < ActiveSupport::TestCase test "should not save product without title" do product = Product.new assert !product.save end end
  • 44. Assosiations belongs_to object bevat id van de relatie has_one de relatie bevat id van object has_many de relatie bevat id van object has_and_belongs_to many-to-many relatie met tussentabel
  • 45. Models > rails generate model user name:string invoke active_record create db/migrate/20120619103822_create_users.rb create app/models/user.rb invoke test_unit create test/unit/user_test.rb create test/fixtures/users.yml > rails generate migration AddUserIdToProducts invoke active_record create db/migrate/20120619103714_add_user_id_to_products.rb
  • 46. Models class AddUserIdToProducts < ActiveRecord::Migration def change add_column :products, :user_id, :integer end end class Product < ActiveRecord::Base attr_accessible :description, :rating, :title, :url belong_to :user validate :title, :presence => true end class User < ActiveRecord::Base attr_accessible :name has_many :products end
  • 47. Models p = Product.create :title => “Boek” u = User.create :name => “Rupert Vliegje” p.user = u p.save u.products.create => “Pizza”
  • 49. Scopes class Product < ActiveRecord::Base attr_accessible :description, :rating, :title, :url belongs_to :user scope :ordered, order(:title) scope :rated, lambda{|rating| where("rating >= ?", rating)} validates :title, :presence => true end
  • 52. Polimorphic Een model kan tot meerdere modellen behoren binnen dezelfde assosiatie. Bijvoorbeeld een plaatje dat bij een product of een user hoort
  • 53. Polymorphic class Picture < ActiveRecord::Base   belongs_to :imageable, :polymorphic => true end   class Product < ActiveRecord::Base attr_accessible :description, :rating, :title, :url belong_to :user has_many :pictures, :as => :imageable scope :ordered, order(:title) scope :rated, lambda{|rating| where("rating >= ?", rating)} validate :title, :presence => true end   class User < ActiveRecord::Base attr_accessible :name has_many :products   has_many :pictures, :as => :imageable end
  • 54. Polymorphic class CreatePictures < ActiveRecord::Migration   def change     create_table :pictures do |t|       t.string  :name       t.integer :imageable_id       t.string  :imageable_type       t.timestamps     end   end end class CreatePictures < ActiveRecord::Migration   def change     create_table :pictures do |t|       t.string :name       t.references :imageable, :polymorphic => true       t.timestamps     end   end end
  • 55. Polymorphic u = User.first u.pictures.create :name => "foto" p = Product.first p.pictures.create :name => "plaatje"
  • 57. Controllers > rails generate controller Products index show create app/controllers/products_controller.rb route get "products/show" route get "products/index" invoke erb create app/views/products create app/views/products/index.html.erb create app/views/products/show.html.erb invoke test_unit create test/functional/products_controller_test.rb invoke helper create app/helpers/products_helper.rb invoke test_unit create test/unit/helpers/products_helper_test.rb invoke assets invoke coffee create app/assets/javascripts/products.js.coffee invoke scss create app/assets/stylesheets/products.css.scss
  • 58. Controllers class ProductsController < ApplicationController def index end def show end end
  • 59. Controllers class ProductsController < ApplicationController def index @products = Product.ordered end def show @product = Product.find_by_id(params[:id]) end end
  • 60. Views app/views/products/index.html.erb <h1>Products#index</h1> <p>Find me in app/views/products/index.html.erb</p> app/views/products/show.html.erb <h1>Products#show</h1> <p>Find me in app/views/products/show.html.erb</p>
  • 61. Views app/views/products/index.html.erb <h1>Products</h1> <% @products.each do |p| %> <p><%= link_to p.title, p %></p> <% end %> app/views/products/show.html.erb <h1><%= @product.title %></h1> <p><%= @product.description.present? ? "#{@product.descirption}" : "Geen beschrijving" %></p> <p><%= @product.rating.present? ? "#{@product.rating}" : "Geen rating" %></p> <p><%= link_to "<< Overzicht", products_path %></p>
  • 62. Routing config/routes.rb DitWilIk::Application.routes.draw do resources :products, :only => [:index, :show] end
  • 63. Routing config/routes.rb DitWilIk::Application.routes.draw do resources :products, :only => [:index, :show] end rake routes
  • 64. Routing config/routes.rb DitWilIk::Application.routes.draw do resources :products, :only => [:index, :show] end rake routes products GET /products(.:format) products#index product GET /products/:id(.:format) products#show
  • 67. Cookies # Retrieve cookie with name "uid" u_name = cookies[:uid] # Set cookie cookies[:uid] = u_name # Delete a cookie cookies.delete(:uid)
  • 68. Sessions session[:user_id] = user.id # sessie opslaan @my_user ||= session[:user_id] && User.find_by_id(session[:user_id]) session[:user_id] = nil # sessie verwijderen reset_session # Sessie resetten
  • 69. Flash flash[:notice] = “Alles is OK!” <%= flash[:notice] if flash[:notice].present? %> redirect_to products_path, :notice => “Product is opgeslagen” flash[:notice].now = “Blijft alleen bewaard voor dit request (AJAX)” flash[:notice].keep = “Blijft bewaard voor volgend request”
  • 70. Forms Rails kent geen Form objecten Forms staan gewoon in views Alle validaties horen in het Model Het Form interacteert met de Controller De Controller met het Model
  • 71. Forms # Forms voor resources <%= form_for(@product) do |f| %> <%= f.label :title %> <%= f.text_field :title %> <%= f.submit “Opslaan” <% end %> # Onafhankelijk formulier <%= form_tag({:controller => "people", :action => "search"}, :method => "get", :class => "nifty_form") %> <p>value:<%= text_field_tag(:search) %></p> <%= submit_tag 'Zoeken' %> <% end %>
  • 74. En nu? railsforzombies.org rails new dit_wil_ik --database mysql
  • 75. En nu? railsforzombies.org rails new dit_wil_ik --database mysql Verlanglijstje - Gebruiker kan zich registreren - Gebruiker kan producten toevoegen die hij graag zou willen hebben - Gebruiker kan een rating aan een product geven - Gebruiker kan een link naar betreffende webshop aan een producten toevoegen - Gebruiker kan een plaatje aan een product toevoegen - Gebruiker kan bij een product een feestgelegenheid toevoegen - Gebruiker kan een toegevoegd product wijzigen en verwijderen - Gebruiker kan feestgelegenheden toevoegen, wijzigen en verwijderen - Gebruiker kan een overzicht van zijn lijst op het scherm zien - Gebruiker kan het overzicht van zijn lijst emailen - ...
  • 76. En nu? railsforzombies.org rails new dit_wil_ik --database mysql Demo: 5 juli Verlanglijstje - Gebruiker kan - Gebruiker kan zich registreren producten toevoegen die hij graag zou willen hebben - Gebruiker kan een rating aan een product geven - Gebruiker kan een link naar betreffende webshop aan een producten toevoegen - Gebruiker kan een plaatje aan een product toevoegen - Gebruiker kan bij een product een feestgelegenheid toevoegen - Gebruiker kan een toegevoegd product wijzigen en verwijderen - Gebruiker kan feestgelegenheden toevoegen, wijzigen en verwijderen - Gebruiker kan een overzicht van zijn lijst op het scherm zien - Gebruiker kan het overzicht van zijn lijst emailen - ...

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n