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)

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

Viewers also liked (7)

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

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

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

Recently uploaded (20)

Down the Rabbit Hole – Solving 5 Training Roadblocks
Down the Rabbit Hole – Solving 5 Training Roadblocks
Rustici Software
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
AudGram Review: Build Visually Appealing, AI-Enhanced Audiograms to Engage Yo...
AudGram Review: Build Visually Appealing, AI-Enhanced Audiograms to Engage Yo...
SOFTTECHHUB
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
biswajitbanerjee38
 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
 
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
 
Artificial Intelligence in the Nonprofit Boardroom.pdf
Artificial Intelligence in the Nonprofit Boardroom.pdf
OnBoard
 
PyData - Graph Theory for Multi-Agent Integration
PyData - Graph Theory for Multi-Agent Integration
barqawicloud
 
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
angelo60207
 
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
Safe Software
 
Oracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI Professional
VICTOR MAESTRE RAMIREZ
 
Your startup on AWS - How to architect and maintain a Lean and Mean account
Your startup on AWS - How to architect and maintain a Lean and Mean account
angelo60207
 
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Enabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FME
Safe Software
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Anish Kumar
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 
Down the Rabbit Hole – Solving 5 Training Roadblocks
Down the Rabbit Hole – Solving 5 Training Roadblocks
Rustici Software
 
Bridging the divide: A conversation on tariffs today in the book industry - T...
Bridging the divide: A conversation on tariffs today in the book industry - T...
BookNet Canada
 
AudGram Review: Build Visually Appealing, AI-Enhanced Audiograms to Engage Yo...
AudGram Review: Build Visually Appealing, AI-Enhanced Audiograms to Engage Yo...
SOFTTECHHUB
 
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
“Addressing Evolving AI Model Challenges Through Memory and Storage,” a Prese...
Edge AI and Vision Alliance
 
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
War_And_Cyber_3_Years_Of_Struggle_And_Lessons_For_Global_Security.pdf
biswajitbanerjee38
 
Edge-banding-machines-edgeteq-s-200-en-.pdf
Edge-banding-machines-edgeteq-s-200-en-.pdf
AmirStern2
 
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Seminar: Evolving Landscape of Post-Quantum Cryptography.pptx
FIDO Alliance
 
Artificial Intelligence in the Nonprofit Boardroom.pdf
Artificial Intelligence in the Nonprofit Boardroom.pdf
OnBoard
 
PyData - Graph Theory for Multi-Agent Integration
PyData - Graph Theory for Multi-Agent Integration
barqawicloud
 
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
Your startup on AWS - How to architect and maintain a Lean and Mean account J...
angelo60207
 
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
FME for Distribution & Transmission Integrity Management Program (DIMP & TIMP)
Safe Software
 
Oracle Cloud Infrastructure Generative AI Professional
Oracle Cloud Infrastructure Generative AI Professional
VICTOR MAESTRE RAMIREZ
 
Your startup on AWS - How to architect and maintain a Lean and Mean account
Your startup on AWS - How to architect and maintain a Lean and Mean account
angelo60207
 
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Reducing Conflicts and Increasing Safety Along the Cycling Networks of East-F...
Safe Software
 
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Seminar: Perspectives on Passkeys & Consumer Adoption.pptx
FIDO Alliance
 
Enabling BIM / GIS integrations with Other Systems with FME
Enabling BIM / GIS integrations with Other Systems with FME
Safe Software
 
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc Webinar - 2025 Global Privacy Survey
TrustArc
 
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Scaling GenAI Inference From Prototype to Production: Real-World Lessons in S...
Anish Kumar
 
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
NTT DATA Technology & Innovation
 
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
ENERGY CONSUMPTION CALCULATION IN ENERGY-EFFICIENT AIR CONDITIONER.pdf
Muhammad Rizwan Akram
 

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!