• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
The Rails way
 

The Rails way

on

  • 423 views

Introductie tot Programeren in Ruby on Rails

Introductie tot Programeren in Ruby on Rails

Statistics

Views

Total Views
423
Views on SlideShare
421
Embed Views
2

Actions

Likes
1
Downloads
3
Comments
0

1 Embed 2

http://www.hanrss.com 2

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

The Rails way The Rails way Presentation Transcript

  • Ruby on Rials The Rails Way 1
  • Rails ≠ Ruby
  • Ruby on Rails Principes
  • Thick models, thincontrollers & 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 ConfigurationModel BlogComment
  • Convention over ConfigurationModel BlogCommentstaat in app/models/blog_comment.rb
  • Convention over ConfigurationModel BlogCommentstaat in app/models/blog_comment.rbheeft een tabelnaam blog_comments
  • Convention over ConfigurationModel BlogComment staat in app/models/blog_comment.rb heeft een tabelnaam blog_commentsController ArchiveController
  • Convention over ConfigurationModel BlogComment staat in app/models/blog_comment.rb heeft een tabelnaam blog_commentsController ArchiveController staat in app/controllers/archive_controller.rb
  • Convention over ConfigurationModel BlogComment staat in app/models/blog_comment.rb heeft een tabelnaam blog_commentsController 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: ActiveRecordActiveRecord is verantwoordelijk voor alledatagerelateerde processenObject/Relationship Mapping (ORM) data inde database wordt gemapt naar een classe inde applicatie
  • Controllers: ActionControllerActionController is verantwoordelijk voor deafhandeling van user requestsFaciliteert de communicatie tussen het modelen de view
  • Views: ActionViewActionView is verantwoordelijk voor hettonen van (delen van) pagina’sMaakt gebruik van een template systeemvb: .html.erb .xml.erb .js.erb
  • RESTRepresentation State TransferGebruikt HTTP (Get, Post, Put, Delete) voorCRUD actiesroutes.rb definieert restfull resources
  • Ruby on Rails Tools
  • command linerails consolerails serverrakerails generaterails dbconsolerails 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 / BDDSchrijf een test die faalt en schrijf daarnacode om de test te laten slagenHet geeft inzicht in wat de code moet doenvoordat deze geschreven wordtTDD test afzonderlijke unitsBDD 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 Applicatiegem install railsgem install bundlerrails new dit_wil_ik --database mysql
  • Gemfile1 plaats voor al je gem dependenciesGemfile.lock houdt de versies bij en hoort inGit te staan
  • Bundlerbundle installbundle updatebundle update mijn_gem
  • Database configconfig/database.ymlHOORT NIET IN GIT!!!!rake db:createrake db:migraterake db:rollbackrake db:rollback STEP=3rake db:migrate:redo STEP=3
  • http://jonathanhui.com/ ruby-rails-3
  • Models> rails generate model product title:string description:text url:string rating:integerinvoke active_recordcreate db/migrate/20120619094230_create_products.rbcreate app/models/product.rbinvoke test_unitcreate test/unit/product_test.rbcreate test/fixtures/products.yml
  • ModelsMigration Modelclass 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" doend # assert true # end end
  • Modelsclass Product < ActiveRecord::Base attr_accessible :description, :rating, :title, :url validate :title, :presence => trueendrequire test_helperclass ProductTest < ActiveSupport::TestCase test "should not save product without title" do product = Product.new assert !product.save endend
  • Assosiations
  • Assosiationsbelongs_to object bevat id van de relatiehas_one de relatie bevat id van objecthas_many de relatie bevat id van objecthas_and_belongs_to many-to-many relatiemet tussentabel
  • Models> rails generate model user name:stringinvoke active_recordcreate db/migrate/20120619103822_create_users.rbcreate app/models/user.rbinvoke test_unitcreate test/unit/user_test.rbcreate test/fixtures/users.yml> rails generate migration AddUserIdToProductsinvoke active_recordcreate db/migrate/20120619103714_add_user_id_to_products.rb
  • Modelsclass AddUserIdToProducts < ActiveRecord::Migration def change add_column :products, :user_id, :integer endendclass Product < ActiveRecord::Base attr_accessible :description, :rating, :title, :url belong_to :user validate :title, :presence => trueendclass User < ActiveRecord::Base attr_accessible :name has_many :productsend
  • Modelsp = Product.create :title => “Boek”u = User.create :name => “Rupert Vliegje”p.user = up.saveu.products.create => “Pizza”
  • Scopes
  • Scopesclass 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 => trueend
  • ScopesProduct.rated(3)Product.orderedProduct.rated(3).ordered
  • Polymorphic...
  • PolimorphicEen model kan tot meerdere modellenbehoren binnen dezelfde assosiatie.Bijvoorbeeld een plaatje dat bij een productof een user hoort
  • Polymorphicclass Picture < ActiveRecord::Base  belongs_to :imageable, :polymorphic => trueend 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 => trueend class User < ActiveRecord::Base attr_accessible :name has_many :products  has_many :pictures, :as => :imageableend
  • Polymorphicclass CreatePictures < ActiveRecord::Migration  def change    create_table :pictures do |t|      t.string  :name      t.integer :imageable_id      t.string  :imageable_type      t.timestamps    end  endendclass CreatePictures < ActiveRecord::Migration  def change    create_table :pictures do |t|      t.string :name      t.references :imageable, :polymorphic => true      t.timestamps    end  endend
  • 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
  • Controllersclass ProductsController < ApplicationController def index end def show endend
  • Controllersclass ProductsController < ApplicationController def index @products = Product.ordered end def show @product = Product.find_by_id(params[:id]) endend
  • Viewsapp/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>
  • Routingconfig/routes.rbDitWilIk::Application.routes.draw do resources :products, :only => [:index, :show]end
  • Routingconfig/routes.rbDitWilIk::Application.routes.draw do resources :products, :only => [:index, :show]endrake routes
  • Routingconfig/routes.rbDitWilIk::Application.routes.draw do resources :products, :only => [:index, :show]endrake routesproducts GET /products(.:format) products#indexproduct GET /products/:id(.:format) products#show
  • En dan
  • Cookie, Session & Flash
  • Cookies# Retrieve cookie with name "uid"u_name = cookies[:uid]# Set cookiecookies[:uid] = u_name# Delete a cookiecookies.delete(:uid)
  • Sessionssession[:user_id] = user.id # sessie opslaan@my_user ||= session[:user_id] && User.find_by_id(session[:user_id])session[:user_id] = nil # sessie verwijderenreset_session # Sessie resetten
  • Flashflash[: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”
  • FormsRails kent geen Form objectenForms staan gewoon in viewsAlle validaties horen in het ModelHet Form interacteert met de ControllerDe 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.orgrails new dit_wil_ik --database mysql
  • En nu? railsforzombies.org rails new dit_wil_ik --database mysqlVerlanglijstje- 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 juliVerlanglijstje- 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- ...