SlideShare a Scribd company logo
Desenvolvimento
Web com Ruby on
Rails
João Lucas Pereira de Santana
gtalk | linkedin | twitter: jlucasps
Extras
Extras
@jlucasps
$ git add .
$ git commit -m "Configurando o Devise"
Criar rotas para BillsController#new
match 'new_bill' => 'bills#new', :as => :new_bill
match 'create_bill' => 'bills#create_bill', :as => :create_bill
Criar action
def new
@bill = Bill.new
@users = User.all
end
Extras
@jlucasps
Alterar template /app/views/welcome/index.html.erb
<div class="span9">
<% label = "<i class='icon-user'></i>&nbsp;#{t('users')}".html_safe
%>
<%= link_to label, users_path, :class => "btn btn-large" %>
<%= link_to t('new_bill'), new_bill_path, :class => "btn btn-
large btn-success" %>
</div>
<%= content_for :sidebar do %>
<%= render :partial => 'shared/sidebar' %>
<% end %>
Extras
@jlucasps
Criar template /app/views/bills/new.html.erb
<h4><%= t('new_bill') %></h4>
<%= form_tag(create_bill_path) do %>
<%= render :partial => 'shared/error_messages' , :locals => {:resource => @bill} %>
<%= label_tag :user_id %>
<%= select_tag :user_id, options_from_collection_for_select(@users, :id, :name, @bill.
user_id) %>
<%= label_tag :name %>
<%= text_field_tag :name, @bill.name %>
<%= label_tag :description %>
<%= text_field_tag :description, @bill.description %>
<%= label_tag :date %>
<%= text_field_tag :date, @bill.date %>
<%= label_tag :value %>
<%= text_field_tag :value, @bill.value %>
<div class='actions'>
<%= submit_tag t('save'), :class => 'btn btn-success' %>
</div>
<% end %>
Extras
@jlucasps
Criar a action BillsController#create_bill
def create_bill
@bill = Bill.new(:user_id => params[:user_id], :name =>
params[:name])
@bill.description = params[:description]
@bill.date = params[:date]
@bill.value = params[:value]
if @bill.save
redirect_to @bill.user
else
@users = User.all
render :new
end
end
Extras
@jlucasps
Criar uma migration para a tabela comments
class CreateTableComments < ActiveRecord::
Migration
def change
create_table :comments do |t|
t.references :bill, :foreign_key => true
t.column :content, :string, :null => false
t.timestamps
end
end
end
Extras
@jlucasps
Executar migration
jlucasps@lotus:/media/truecrypt1/handsonrails/first_app$ rake db:
migrate
== CreateTableComments: migrating
==========================================
==
-- create_table(:comments)
-> 0.0670s
== CreateTableComments: migrated (0.0672s)
===================================
Extras
@jlucasps
Criar model Comment: /app/models/comment.rb
class Comment < ActiveRecord::Base
# Attrs accessible
attr_accessible :content, :bill_id
# Validations
validates :content, :presence => true, :allow_blank => false
validates :bill_id, :presence => true
# Associations
belongs_to :bill
# Scopes
default_scope order("comments.created_at DESC")
# Públic methods
end
Extras
@jlucasps
Alterar model Bill para adicionar relacionamento
class Bill < ActiveRecord::Base
# Attrs accessible
attr_accessible :name, :description, :user_id, :date, :value
# Validations
validates :name, :presence => true, :allow_blank => false
validates :user_id, :presence => true
validates :date, :presence => true
validates :value, :presence => true
# Associations
belongs_to :user
has_many :comments
...
end
Extras
@jlucasps
irb(main):002:0> bill = Bill.first
Bill Load (0.5ms) SELECT "bills".* FROM "bills" ORDER BY bills.date
DESC LIMIT 1
=> #<Bill id: 15, name: "123", description: "45", user_id: 9, date:
"2013-06-12 00:00:00", value: #<BigDecimal:3bc4e60,'0.124E3',9(36)
>, created_at: "2013-06-19 01:17:36", updated_at: "2013-06-19 01:17:
36">
irb(main):003:0> comment = Comment.new :bill_id => bill.id, :
content => "Conteúdo do comentário"
=> #<Comment id: nil, bill_id: 15, content: "Conteúdo do comentário",
created_at: nil, updated_at: nil>
irb(main):004:0> comment.save
(0.1ms) begin transaction
SQL (43.4ms) INSERT INTO "comments" ("bill_id", "content",
"created_at", "updated_at") VALUES (?, ?, ?, ?) [["bill_id", 15],
["content", "Conteúdo do comentário"], ["created_at", Tue, 25 Jun 2013
14:30:13 UTC +00:00], ["updated_at", Tue, 25 Jun 2013 14:30:13 UTC
+00:00]]
(393.4ms) commit transaction
Extras
@jlucasps
irb(main):005:0> bill.comments
Comment Load (0.4ms) SELECT "comments".* FROM "comments"
WHERE "comments"."bill_id" = 15 ORDER BY comments.created_at
DESC
=> [#<Comment id: 1, bill_id: 15, content: "Conteúdo do comentário",
created_at: "2013-06-25 14:30:13", updated_at: "2013-06-25 14:30:
13">]
irb(main):006:0> bill.comments.count
(0.3ms) SELECT COUNT(*) FROM "comments" WHERE "comments"."
bill_id" = 15
=> 1
irb(main):007:0> comment.bill
Bill Load (0.4ms) SELECT "bills".* FROM "bills" WHERE "bills"."id" = 15
ORDER BY bills.date DESC LIMIT 1
=> #<Bill id: 15, name: "123", description: "45", user_id: 9, date:
"2013-06-12 00:00:00", value: #<BigDecimal:42d7f68,'0.124E3',9(36)
>, created_at: "2013-06-19 01:17:36", updated_at: "2013-06-19 01:
17:36">
irb(main):008:0>
Extras
@jlucasps
E se quisermos adicionar comentários em outras entidades ?
jlucasps@lotus:/media/truecrypt1/handsonrails/first_app$ rails g migration
ChangeCommentsTable
invoke active_record
create db/migrate/20130625143912_change_comments_table.rb
class ChangeCommentsTable < ActiveRecord::Migration
def up
add_column :comments, :commentable_id, :integer
add_column :comments, :commentable_type, :string
remove_column :comments, :bill_id
end
def down
remove_column :comments, :commentable_id
remove_column :comments, :commentable_type
add_column :comments, :bill_id, :integer
end
end
Extras
@jlucasps
class Comment < ActiveRecord::Base
# Attrs accessible
attr_accessible :content, :bill_id
# Validations
validates :content, :presence => true, :allow_blank => false
validates :commentable_id, :presence => true
validates :commentable_type, :presence => true
# Associations
belongs_to :commentable, :polymorphic => true
# Scopes
default_scope order("comments.created_at DESC")
end
/app/models/comment.rb
Extras
@jlucasps
# Associations
belongs_to :user
has_many :comments, :as => :commentable
/app/models/bill.rb
/app/models/user.rb
# Associations
has_many :bills, :dependent => :destroy
has_many :comments, :as => :commentable
Extras
@jlucasps
jlucasps@lotus:/media/truecrypt1/handsonrails/first_app$ rails
console
Loading development environment (Rails 3.2.13)
irb(main):002:0> user = User.last
User Load (0.4ms) SELECT "users".* FROM "users" ORDER BY "users"."
id" DESC LIMIT 1
=> #<User id: 11, name: "teste100@teste.com", email:
"teste100@teste.com", age: nil, created_at: "2013-06-25 01:27:25",
updated_at: "2013-06-25 01:27:25", gender: nil, encrypted_password:
"$2a$10$hMAd4RUymIzxw1JGARKJC.M1hEiAwD0PpwS6uwM9j2RR...",
reset_password_token: nil, reset_password_sent_at: nil,
remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2013-
06-25 01:27:25", last_sign_in_at: "2013-06-25 01:27:25",
current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1">
irb(main):003:0> user.comments
Comment Load (0.2ms) SELECT "comments".* FROM "comments"
WHERE "comments"."commentable_id" = 11 AND "comments"."
commentable_type" = 'User' ORDER BY comments.created_at DESC
=> []
irb(main):004:0>
Extras
@jlucasps
irb(main):003:0> comment = Comment.new :content =>
"Comentário para um usuário"
=> #<Comment id: nil, content: "Comentário para um usuário",
created_at: nil, updated_at: nil, commentable_id: nil, commentable_type:
nil>
irb(main):004:0> comment.commentable = user
=> #<User id: 11, name: "teste100@teste.com", email: "teste100@teste.com", age: nil,
created_at: "2013-06-25 01:27:25", updated_at: "2013-06-25 01:27:25", gender: nil,
encrypted_password: "$2a$10$hMAd4RUymIzxw1JGARKJC.M1hEiAwD0PpwS6uwM9j2RR...",
reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil,
sign_in_count: 1, current_sign_in_at: "2013-06-25 01:27:25", last_sign_in_at: "2013-06-25
01:27:25", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1">
irb(main):005:0> comment.save
(0.1ms) begin transaction
SQL (63.5ms) INSERT INTO "comments" ("commentable_id", "commentable_type", "content",
"created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["commentable_id", 11],
["commentable_type", "User"], ["content", "Comentário para um usuário"], ["created_at", Tue,
25 Jun 2013 17:39:18 UTC +00:00], ["updated_at", Tue, 25 Jun 2013 17:39:18 UTC +00:
00]]
(405.1ms) commit transaction
=> true
Extras
@jlucasps
irb(main):008:0> bill = Bill.first
Bill Load (0.4ms) SELECT "bills".* FROM "bills" ORDER BY bills.date DESC LIMIT 1
=> #<Bill id: 15, name: "123", description: "45", user_id: 9, date: "2013-06-12 00:00:00", value:
#<BigDecimal:43384f8,'0.124E3',9(36)>, created_at: "2013-06-19 01:17:36", updated_at: "2013-
06-19 01:17:36">
irb(main):009:0> comment_2 = Comment.new :content => "Comentário
de uma conta"
=> #<Comment id: nil, content: "Comentário de uma conta", created_at: nil, updated_at: nil,
commentable_id: nil, commentable_type: nil>
irb(main):011:0> comment_2.commentable = bill
=> #<Bill id: 15, name: "123", description: "45", user_id: 9, date: "2013-06-12 00:00:00", value:
#<BigDecimal:41fbae0,'0.124E3',9(36)>, created_at: "2013-06-19 01:17:36", updated_at: "2013-
06-19 01:17:36">
irb(main):012:0> comment_2.save
(0.1ms) begin transaction
SQL (0.7ms) INSERT INTO "comments" ("commentable_id", "commentable_type", "content",
"created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["commentable_id", 15], ["commentable_type",
"Bill"], ["content", "Comentário de uma conta"], ["created_at", Tue, 25 Jun 2013 17:44:17 UTC
+00:00], ["updated_at", Tue, 25 Jun 2013 17:44:17 UTC +00:00]]
(430.8ms) commit transaction
=> true
irb(main):013:0> bill.comments
Comment Load (0.4ms) SELECT "comments".* FROM "comments" WHERE "comments"."
commentable_id" = 15 AND "comments"."commentable_type" = 'Bill' ORDER BY comments.
created_at DESC
=> [#<Comment id: 3, content: "Comentário de uma conta", created_at: "2013-06-25 17:44:17",
updated_at: "2013-06-25 17:44:17", commentable_id: 15, commentable_type: "Bill">]
Extras
@jlucasps
irb(main):014:0> comment.commentable
=> #<User id: 11, name: "teste100@teste.com", email:
"teste100@teste.com", age: nil, created_at: "2013-06-25 01:27:25",
updated_at: "2013-06-25 01:27:25", gender: nil, encrypted_password:
"$2a$10$hMAd4RUymIzxw1JGARKJC.M1hEiAwD0PpwS6uwM9j2RR...",
reset_password_token: nil, reset_password_sent_at: nil,
remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2013-
06-25 01:27:25", last_sign_in_at: "2013-06-25 01:27:25",
current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1">
irb(main):015:0> comment_2.commentable
=> #<Bill id: 15, name: "123", description: "45", user_id: 9, date:
"2013-06-12 00:00:00", value: #<BigDecimal:3ed9268,'0.124E3',9(36)
>, created_at: "2013-06-19 01:17:36", updated_at: "2013-06-19 01:17:
36">
irb(main):016:0>
Desenvolvimento
Web com Ruby on
Rails
João Lucas Pereira de Santana
gtalk | linkedin | twitter: jlucasps
Obrigado!

More Related Content

What's hot (19)

PDF
前端MVC之BackboneJS
Zhang Xiaoxue
 
PDF
Building iPhone Web Apps using "classic" Domino
Rob Bontekoe
 
PPTX
course js day 3
Georgyi Grigoryev
 
PDF
Before there was Hoop Dreams, there was McDonald's: Strange and Beautiful
chicagonewsonlineradio
 
PDF
Django Class-based views (Slovenian)
Luka Zakrajšek
 
PDF
Desenvolvimento web com Ruby on Rails (parte 5)
Joao Lucas Santana
 
PPT
Backbone.js
Knoldus Inc.
 
PPTX
Geb qa fest2017
Sviatkin Yaroslav
 
PDF
Micro app-framework
Michael Dawson
 
PDF
EmberConf 2015 – Ambitious UX for Ambitious Apps
Lauren Elizabeth Tan
 
PDF
WebApps e Frameworks Javascript
meet2Brains
 
PDF
The rise and fall of a techno DJ, plus more new reviews and notable screenings
chicagonewsyesterday
 
PDF
TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...
tdc-globalcode
 
PPT
Creating the interfaces of the future with the APIs of today
gerbille
 
PDF
Clickable DIVs and other icebergs
Ben Buchanan
 
PDF
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
Joao Lucas Santana
 
KEY
Authentication
soon
 
KEY
JavaScript Testing for Rubyists
Jamie Dyer
 
ODP
Android query
Michal Pavlasek
 
前端MVC之BackboneJS
Zhang Xiaoxue
 
Building iPhone Web Apps using "classic" Domino
Rob Bontekoe
 
course js day 3
Georgyi Grigoryev
 
Before there was Hoop Dreams, there was McDonald's: Strange and Beautiful
chicagonewsonlineradio
 
Django Class-based views (Slovenian)
Luka Zakrajšek
 
Desenvolvimento web com Ruby on Rails (parte 5)
Joao Lucas Santana
 
Backbone.js
Knoldus Inc.
 
Geb qa fest2017
Sviatkin Yaroslav
 
Micro app-framework
Michael Dawson
 
EmberConf 2015 – Ambitious UX for Ambitious Apps
Lauren Elizabeth Tan
 
WebApps e Frameworks Javascript
meet2Brains
 
The rise and fall of a techno DJ, plus more new reviews and notable screenings
chicagonewsyesterday
 
TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...
tdc-globalcode
 
Creating the interfaces of the future with the APIs of today
gerbille
 
Clickable DIVs and other icebergs
Ben Buchanan
 
Um roadmap do Framework Ruby on Rails, do Rails 1 ao Rails 4 - DevDay 2013
Joao Lucas Santana
 
Authentication
soon
 
JavaScript Testing for Rubyists
Jamie Dyer
 
Android query
Michal Pavlasek
 

Viewers also liked (7)

PDF
Curso de Ruby on Rails - Aula 04
Maurício Linhares
 
PDF
Desenvolvimento web com Ruby on Rails (parte 4)
Joao Lucas Santana
 
PDF
Desenvolvimento web com Ruby on Rails (parte 2)
Joao Lucas Santana
 
PDF
Desenvolvimento web com Ruby on Rails (parte 3)
Joao Lucas Santana
 
PDF
Consultation on 16 19 vocational reform fa qs (5)
amyclaire
 
PDF
Desenvolvimento web com Ruby on Rails (parte 6)
Joao Lucas Santana
 
PDF
Servidores de E-mail: Qmail, Sendmail e Postfix
Alvaro Oliveira
 
Curso de Ruby on Rails - Aula 04
Maurício Linhares
 
Desenvolvimento web com Ruby on Rails (parte 4)
Joao Lucas Santana
 
Desenvolvimento web com Ruby on Rails (parte 2)
Joao Lucas Santana
 
Desenvolvimento web com Ruby on Rails (parte 3)
Joao Lucas Santana
 
Consultation on 16 19 vocational reform fa qs (5)
amyclaire
 
Desenvolvimento web com Ruby on Rails (parte 6)
Joao Lucas Santana
 
Servidores de E-mail: Qmail, Sendmail e Postfix
Alvaro Oliveira
 
Ad

Similar to Desenvolvimento web com Ruby on Rails (extras) (20)

PDF
Ruby on Rails 2.1 What's New
Libin Pan
 
PDF
Carlosbrando Rubyonrails21 En
Casey Bradford
 
PDF
TDC 2015 - DSLs em Ruby
Guilherme Carreiro
 
PDF
ActiveRecord Query Interface (2), Season 2
RORLAB
 
PDF
performance vamos dormir mais?
tdc-globalcode
 
KEY
Active Record Query Interface (1), Season 2
RORLAB
 
PDF
Rails 3 Beautiful Code
GreggPollack
 
PPTX
Querying with Rails
Parth Modi
 
PDF
Chinaonrails Rubyonrails21 Zh
Jesse Cai
 
PDF
Active Record Inheritance in Rails
Sandip Ransing
 
PDF
Rails workshop for Java people (September 2015)
Andre Foeken
 
PDF
td_mxc_rubyrails_shin
tutorialsruby
 
PDF
td_mxc_rubyrails_shin
tutorialsruby
 
PDF
RubyOnRails-Cheatsheet-BlaineKendall
tutorialsruby
 
PDF
RubyOnRails-Cheatsheet-BlaineKendall
tutorialsruby
 
PDF
Ruby on Rails 2.1 What's New Chinese Version
Libin Pan
 
PPTX
Intro to Rails 4
Kartik Sahoo
 
KEY
Código Saudável => Programador Feliz - Rs on Rails 2010
Plataformatec
 
KEY
Repensando o Desenvolvimento Web com Ruby on Rails
Dante Regis
 
PDF
How to avoid hanging yourself with Rails
Rowan Hick
 
Ruby on Rails 2.1 What's New
Libin Pan
 
Carlosbrando Rubyonrails21 En
Casey Bradford
 
TDC 2015 - DSLs em Ruby
Guilherme Carreiro
 
ActiveRecord Query Interface (2), Season 2
RORLAB
 
performance vamos dormir mais?
tdc-globalcode
 
Active Record Query Interface (1), Season 2
RORLAB
 
Rails 3 Beautiful Code
GreggPollack
 
Querying with Rails
Parth Modi
 
Chinaonrails Rubyonrails21 Zh
Jesse Cai
 
Active Record Inheritance in Rails
Sandip Ransing
 
Rails workshop for Java people (September 2015)
Andre Foeken
 
td_mxc_rubyrails_shin
tutorialsruby
 
td_mxc_rubyrails_shin
tutorialsruby
 
RubyOnRails-Cheatsheet-BlaineKendall
tutorialsruby
 
RubyOnRails-Cheatsheet-BlaineKendall
tutorialsruby
 
Ruby on Rails 2.1 What's New Chinese Version
Libin Pan
 
Intro to Rails 4
Kartik Sahoo
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Plataformatec
 
Repensando o Desenvolvimento Web com Ruby on Rails
Dante Regis
 
How to avoid hanging yourself with Rails
Rowan Hick
 
Ad

Recently uploaded (20)

PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
IoT-Powered Industrial Transformation – Smart Manufacturing to Connected Heal...
Rejig Digital
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PDF
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
July Patch Tuesday
Ivanti
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
IoT-Powered Industrial Transformation – Smart Manufacturing to Connected Heal...
Rejig Digital
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
July Patch Tuesday
Ivanti
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 

Desenvolvimento web com Ruby on Rails (extras)

  • 1. Desenvolvimento Web com Ruby on Rails João Lucas Pereira de Santana gtalk | linkedin | twitter: jlucasps Extras
  • 2. Extras @jlucasps $ git add . $ git commit -m "Configurando o Devise" Criar rotas para BillsController#new match 'new_bill' => 'bills#new', :as => :new_bill match 'create_bill' => 'bills#create_bill', :as => :create_bill Criar action def new @bill = Bill.new @users = User.all end
  • 3. Extras @jlucasps Alterar template /app/views/welcome/index.html.erb <div class="span9"> <% label = "<i class='icon-user'></i>&nbsp;#{t('users')}".html_safe %> <%= link_to label, users_path, :class => "btn btn-large" %> <%= link_to t('new_bill'), new_bill_path, :class => "btn btn- large btn-success" %> </div> <%= content_for :sidebar do %> <%= render :partial => 'shared/sidebar' %> <% end %>
  • 4. Extras @jlucasps Criar template /app/views/bills/new.html.erb <h4><%= t('new_bill') %></h4> <%= form_tag(create_bill_path) do %> <%= render :partial => 'shared/error_messages' , :locals => {:resource => @bill} %> <%= label_tag :user_id %> <%= select_tag :user_id, options_from_collection_for_select(@users, :id, :name, @bill. user_id) %> <%= label_tag :name %> <%= text_field_tag :name, @bill.name %> <%= label_tag :description %> <%= text_field_tag :description, @bill.description %> <%= label_tag :date %> <%= text_field_tag :date, @bill.date %> <%= label_tag :value %> <%= text_field_tag :value, @bill.value %> <div class='actions'> <%= submit_tag t('save'), :class => 'btn btn-success' %> </div> <% end %>
  • 5. Extras @jlucasps Criar a action BillsController#create_bill def create_bill @bill = Bill.new(:user_id => params[:user_id], :name => params[:name]) @bill.description = params[:description] @bill.date = params[:date] @bill.value = params[:value] if @bill.save redirect_to @bill.user else @users = User.all render :new end end
  • 6. Extras @jlucasps Criar uma migration para a tabela comments class CreateTableComments < ActiveRecord:: Migration def change create_table :comments do |t| t.references :bill, :foreign_key => true t.column :content, :string, :null => false t.timestamps end end end
  • 7. Extras @jlucasps Executar migration jlucasps@lotus:/media/truecrypt1/handsonrails/first_app$ rake db: migrate == CreateTableComments: migrating ========================================== == -- create_table(:comments) -> 0.0670s == CreateTableComments: migrated (0.0672s) ===================================
  • 8. Extras @jlucasps Criar model Comment: /app/models/comment.rb class Comment < ActiveRecord::Base # Attrs accessible attr_accessible :content, :bill_id # Validations validates :content, :presence => true, :allow_blank => false validates :bill_id, :presence => true # Associations belongs_to :bill # Scopes default_scope order("comments.created_at DESC") # Públic methods end
  • 9. Extras @jlucasps Alterar model Bill para adicionar relacionamento class Bill < ActiveRecord::Base # Attrs accessible attr_accessible :name, :description, :user_id, :date, :value # Validations validates :name, :presence => true, :allow_blank => false validates :user_id, :presence => true validates :date, :presence => true validates :value, :presence => true # Associations belongs_to :user has_many :comments ... end
  • 10. Extras @jlucasps irb(main):002:0> bill = Bill.first Bill Load (0.5ms) SELECT "bills".* FROM "bills" ORDER BY bills.date DESC LIMIT 1 => #<Bill id: 15, name: "123", description: "45", user_id: 9, date: "2013-06-12 00:00:00", value: #<BigDecimal:3bc4e60,'0.124E3',9(36) >, created_at: "2013-06-19 01:17:36", updated_at: "2013-06-19 01:17: 36"> irb(main):003:0> comment = Comment.new :bill_id => bill.id, : content => "Conteúdo do comentário" => #<Comment id: nil, bill_id: 15, content: "Conteúdo do comentário", created_at: nil, updated_at: nil> irb(main):004:0> comment.save (0.1ms) begin transaction SQL (43.4ms) INSERT INTO "comments" ("bill_id", "content", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["bill_id", 15], ["content", "Conteúdo do comentário"], ["created_at", Tue, 25 Jun 2013 14:30:13 UTC +00:00], ["updated_at", Tue, 25 Jun 2013 14:30:13 UTC +00:00]] (393.4ms) commit transaction
  • 11. Extras @jlucasps irb(main):005:0> bill.comments Comment Load (0.4ms) SELECT "comments".* FROM "comments" WHERE "comments"."bill_id" = 15 ORDER BY comments.created_at DESC => [#<Comment id: 1, bill_id: 15, content: "Conteúdo do comentário", created_at: "2013-06-25 14:30:13", updated_at: "2013-06-25 14:30: 13">] irb(main):006:0> bill.comments.count (0.3ms) SELECT COUNT(*) FROM "comments" WHERE "comments"." bill_id" = 15 => 1 irb(main):007:0> comment.bill Bill Load (0.4ms) SELECT "bills".* FROM "bills" WHERE "bills"."id" = 15 ORDER BY bills.date DESC LIMIT 1 => #<Bill id: 15, name: "123", description: "45", user_id: 9, date: "2013-06-12 00:00:00", value: #<BigDecimal:42d7f68,'0.124E3',9(36) >, created_at: "2013-06-19 01:17:36", updated_at: "2013-06-19 01: 17:36"> irb(main):008:0>
  • 12. Extras @jlucasps E se quisermos adicionar comentários em outras entidades ? jlucasps@lotus:/media/truecrypt1/handsonrails/first_app$ rails g migration ChangeCommentsTable invoke active_record create db/migrate/20130625143912_change_comments_table.rb class ChangeCommentsTable < ActiveRecord::Migration def up add_column :comments, :commentable_id, :integer add_column :comments, :commentable_type, :string remove_column :comments, :bill_id end def down remove_column :comments, :commentable_id remove_column :comments, :commentable_type add_column :comments, :bill_id, :integer end end
  • 13. Extras @jlucasps class Comment < ActiveRecord::Base # Attrs accessible attr_accessible :content, :bill_id # Validations validates :content, :presence => true, :allow_blank => false validates :commentable_id, :presence => true validates :commentable_type, :presence => true # Associations belongs_to :commentable, :polymorphic => true # Scopes default_scope order("comments.created_at DESC") end /app/models/comment.rb
  • 14. Extras @jlucasps # Associations belongs_to :user has_many :comments, :as => :commentable /app/models/bill.rb /app/models/user.rb # Associations has_many :bills, :dependent => :destroy has_many :comments, :as => :commentable
  • 15. Extras @jlucasps jlucasps@lotus:/media/truecrypt1/handsonrails/first_app$ rails console Loading development environment (Rails 3.2.13) irb(main):002:0> user = User.last User Load (0.4ms) SELECT "users".* FROM "users" ORDER BY "users"." id" DESC LIMIT 1 => #<User id: 11, name: "[email protected]", email: "[email protected]", age: nil, created_at: "2013-06-25 01:27:25", updated_at: "2013-06-25 01:27:25", gender: nil, encrypted_password: "$2a$10$hMAd4RUymIzxw1JGARKJC.M1hEiAwD0PpwS6uwM9j2RR...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2013- 06-25 01:27:25", last_sign_in_at: "2013-06-25 01:27:25", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1"> irb(main):003:0> user.comments Comment Load (0.2ms) SELECT "comments".* FROM "comments" WHERE "comments"."commentable_id" = 11 AND "comments"." commentable_type" = 'User' ORDER BY comments.created_at DESC => [] irb(main):004:0>
  • 16. Extras @jlucasps irb(main):003:0> comment = Comment.new :content => "Comentário para um usuário" => #<Comment id: nil, content: "Comentário para um usuário", created_at: nil, updated_at: nil, commentable_id: nil, commentable_type: nil> irb(main):004:0> comment.commentable = user => #<User id: 11, name: "[email protected]", email: "[email protected]", age: nil, created_at: "2013-06-25 01:27:25", updated_at: "2013-06-25 01:27:25", gender: nil, encrypted_password: "$2a$10$hMAd4RUymIzxw1JGARKJC.M1hEiAwD0PpwS6uwM9j2RR...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2013-06-25 01:27:25", last_sign_in_at: "2013-06-25 01:27:25", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1"> irb(main):005:0> comment.save (0.1ms) begin transaction SQL (63.5ms) INSERT INTO "comments" ("commentable_id", "commentable_type", "content", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["commentable_id", 11], ["commentable_type", "User"], ["content", "Comentário para um usuário"], ["created_at", Tue, 25 Jun 2013 17:39:18 UTC +00:00], ["updated_at", Tue, 25 Jun 2013 17:39:18 UTC +00: 00]] (405.1ms) commit transaction => true
  • 17. Extras @jlucasps irb(main):008:0> bill = Bill.first Bill Load (0.4ms) SELECT "bills".* FROM "bills" ORDER BY bills.date DESC LIMIT 1 => #<Bill id: 15, name: "123", description: "45", user_id: 9, date: "2013-06-12 00:00:00", value: #<BigDecimal:43384f8,'0.124E3',9(36)>, created_at: "2013-06-19 01:17:36", updated_at: "2013- 06-19 01:17:36"> irb(main):009:0> comment_2 = Comment.new :content => "Comentário de uma conta" => #<Comment id: nil, content: "Comentário de uma conta", created_at: nil, updated_at: nil, commentable_id: nil, commentable_type: nil> irb(main):011:0> comment_2.commentable = bill => #<Bill id: 15, name: "123", description: "45", user_id: 9, date: "2013-06-12 00:00:00", value: #<BigDecimal:41fbae0,'0.124E3',9(36)>, created_at: "2013-06-19 01:17:36", updated_at: "2013- 06-19 01:17:36"> irb(main):012:0> comment_2.save (0.1ms) begin transaction SQL (0.7ms) INSERT INTO "comments" ("commentable_id", "commentable_type", "content", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["commentable_id", 15], ["commentable_type", "Bill"], ["content", "Comentário de uma conta"], ["created_at", Tue, 25 Jun 2013 17:44:17 UTC +00:00], ["updated_at", Tue, 25 Jun 2013 17:44:17 UTC +00:00]] (430.8ms) commit transaction => true irb(main):013:0> bill.comments Comment Load (0.4ms) SELECT "comments".* FROM "comments" WHERE "comments"." commentable_id" = 15 AND "comments"."commentable_type" = 'Bill' ORDER BY comments. created_at DESC => [#<Comment id: 3, content: "Comentário de uma conta", created_at: "2013-06-25 17:44:17", updated_at: "2013-06-25 17:44:17", commentable_id: 15, commentable_type: "Bill">]
  • 18. Extras @jlucasps irb(main):014:0> comment.commentable => #<User id: 11, name: "[email protected]", email: "[email protected]", age: nil, created_at: "2013-06-25 01:27:25", updated_at: "2013-06-25 01:27:25", gender: nil, encrypted_password: "$2a$10$hMAd4RUymIzxw1JGARKJC.M1hEiAwD0PpwS6uwM9j2RR...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2013- 06-25 01:27:25", last_sign_in_at: "2013-06-25 01:27:25", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1"> irb(main):015:0> comment_2.commentable => #<Bill id: 15, name: "123", description: "45", user_id: 9, date: "2013-06-12 00:00:00", value: #<BigDecimal:3ed9268,'0.124E3',9(36) >, created_at: "2013-06-19 01:17:36", updated_at: "2013-06-19 01:17: 36"> irb(main):016:0>
  • 19. Desenvolvimento Web com Ruby on Rails João Lucas Pereira de Santana gtalk | linkedin | twitter: jlucasps Obrigado!