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)
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
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
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
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
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”
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"
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>
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
- ...