desenvolvimento web com ruby on rails (extras)

19
Desenvolvimento Web com Ruby on Rails João Lucas Pereira de Santana gtalk | linkedin | twitter: jlucasps Extras

Upload: joao-lucas-santana

Post on 25-May-2015

767 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Desenvolvimento web com Ruby on Rails (extras)

Desenvolvimento Web com Ruby on

Rails

João Lucas Pereira de Santanagtalk | linkedin | twitter: jlucasps

Extras

Page 2: Desenvolvimento web com Ruby on Rails (extras)

Extras

@jlucasps

$ git add .

$ git commit -m "Configurando o Devise"

Criar rotas para BillsController#new

match 'new_bill' => 'bills#new', :as => :new_billmatch 'create_bill' => 'bills#create_bill', :as => :create_bill

Criar action

def new @bill = Bill.new @users = User.all end

Page 3: Desenvolvimento web com Ruby on Rails (extras)

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 %>

Page 4: Desenvolvimento web com Ruby on Rails (extras)

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 %>

Page 5: Desenvolvimento web com Ruby on Rails (extras)

Extras

@jlucasps

Criar a action BillsController#create_billdef 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 endend

Page 6: Desenvolvimento web com Ruby on Rails (extras)

Extras

@jlucasps

Criar uma migration para a tabela commentsclass 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 endend

Page 7: Desenvolvimento web com Ruby on Rails (extras)

Extras

@jlucasps

Executar migrationjlucasps@lotus:/media/truecrypt1/handsonrails/first_app$ rake db:migrate== CreateTableComments: migrating ============================================-- create_table(:comments) -> 0.0670s== CreateTableComments: migrated (0.0672s) ===================================

Page 8: Desenvolvimento web com Ruby on Rails (extras)

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

Page 9: Desenvolvimento web com Ruby on Rails (extras)

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

Page 10: Desenvolvimento web com Ruby on Rails (extras)

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=> true

Page 11: Desenvolvimento web com Ruby on Rails (extras)

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=> 1irb(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>

Page 12: Desenvolvimento web com Ruby on Rails (extras)

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 endend

Page 13: Desenvolvimento web com Ruby on Rails (extras)

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

Page 14: Desenvolvimento web com Ruby on Rails (extras)

Extras

@jlucasps

# Associationsbelongs_to :userhas_many :comments, :as => :commentable

/app/models/bill.rb

/app/models/user.rb

# Associationshas_many :bills, :dependent => :destroyhas_many :comments, :as => :commentable

Page 15: Desenvolvimento web com Ruby on Rails (extras)

Extras

@jlucasps

jlucasps@lotus:/media/truecrypt1/handsonrails/first_app$ rails consoleLoading 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>

Page 16: Desenvolvimento web com Ruby on Rails (extras)

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

Page 17: Desenvolvimento web com Ruby on Rails (extras)

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=> trueirb(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">]

Page 18: Desenvolvimento web com Ruby on Rails (extras)

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>

Page 19: Desenvolvimento web com Ruby on Rails (extras)

Desenvolvimento Web com Ruby on

Rails

João Lucas Pereira de Santanagtalk | linkedin | twitter: jlucasps

Obrigado!