Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Rails 3


Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
Rails 3

   ID                      blog                      twitter

Carlos Antonio    blog.plataformatec.com.br   @cant...
Quem sou eu?

           • Carlos Antonio   da Silva

           • Desenvolvedor    Ruby e Rails há mais de 2 anos

      ...
Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Desenvolvimento de
aplicações em Rails




 Coaching em                                 Consultoria
 Rails e Agile

Carlos...
Rails 3


Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
Como tudo começou?




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Como tudo começou?




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Como tudo começou?




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Como tudo começou?




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Como tudo começou?




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Como tudo começou?




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Vantagens do Rails 3




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Vantagens do Rails 3




                      Performance



Carlos Antonio        blog.plataformatec.com.br   @cantoniod...
Vantagens do Rails 3



                      Modularidade


                      Performance



Carlos Antonio        bl...
Vantagens do Rails 3

                      Agnosticismo


                      Modularidade


                      Perf...
Arquitetura

                           Rails

                   ActionDispatch

                   ActiveSupport




Car...
Arquitetura
                                        Todo o resto são
                                            Railties!...
Arquitetura
                                                Todo o resto são
                                             ...
Como o Rails 3
muda o modo como
 desenvolvemos?

Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
rails command
   Rails 2.3                                   Rails 3


   rails blog                                  rail...
rails command
   Rails 2.3                                      Rails 3
   ruby script/server                             ...
rails command
   Rails 3                                       Shortcuts!
   rails server                                 ...
blog/config.ru


       require ::File.expand_path('../config/environment',   __FILE__)
       run Blog::Application




Ca...
blog/config.ru


       require ::File.expand_path('../config/environment',   __FILE__)
       run Blog::Application




Ca...
blog/config/application.rb
        require File.expand_path('../boot', __FILE__)
        require 'rails/all'

        Bundl...
blog/config/application.rb
        require File.expand_path('../boot', __FILE__)
        require 'rails/all'

        Bundl...
O que é uma Rack App?




Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
O que é uma Rack App?

        Qualquer objeto que responde ao método call,
         retornando um array com três parâmetr...
blog/config/application.rb
        require File.expand_path('../boot', __FILE__)
        require 'rails/all'

        Bundl...
blog/config/application.rb
        require File.expand_path('../boot', __FILE__)
        require 'rails/all'

        Bundl...
blog/config/boot.rb
          require 'rubygems'

          # Set up gems listed in the Gemfile.
          gemfile = File.e...
blog/config/boot.rb
          require 'rubygems'

          # Set up gems listed in the Gemfile.
          gemfile = File.e...
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
 ...
Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Biblioteca para gerenciamento de
          dependências



Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Rubygems
        Resolução de dependências
                 rsrails$ gem dependency actionpack -v="2.3.5"
                ...
Rubygems
        Resolução de dependências
                 rsrails$ gem dependency actionpack -v="2.3.5"
                ...
Rubygems
        Resolução de dependências
 Gems instaladas do rack:   require "rubygems"
  * rack (1.0.1)            requ...
Rubygems
        Resolução de dependências
 Gems instaladas do rack:   require "rubygems"
  * rack (1.0.1)            requ...
Rubygems
        Resolução de dependências
 Gems instaladas do rack:   require "rubygems"
  * rack (1.0.1)            requ...
Rubygems
        Resolução de dependências
 Gems instaladas do rack:   require "rubygems"
  * rack (1.0.1)            requ...
Rubygems
        Resolução de dependências
 Gems instaladas do rack:   require "rubygems"
  * rack (1.0.1)            requ...
Bundler: Gemfile
                   # Gemfile
                   gem "thin"
                   gem "actionpack", "2.3.5"


...
Bundler: Gemfile
                   # Gemfile
                   gem "thin"
                   gem "actionpack", "2.3.5"


...
Bundler: Gemfile
                   # Gemfile
                   gem "thin"
                   gem "actionpack", "2.3.5"


...
Rubygems
                 $LOAD_PATH



Carlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
}
          rsrails$ gem list
          *** LOCAL GEMS ***

          bundler (0.9.25)
          rake (0.8.7, 0.8.5)
     ...
}
          rsrails$ gem list
          *** LOCAL GEMS ***

          bundler (0.9.25)
          rake (0.8.7, 0.8.5)
     ...
}
          rsrails$ gem list
          *** LOCAL GEMS ***

          bundler (0.9.25)
          rake (0.8.7, 0.8.5)
     ...
Bundler
             Lock no $LOAD_PATH



Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
Esqueci de colocar no config.gem!




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Esqueci de colocar no config.gem!




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
}
          rsrails$ gem list
          *** LOCAL GEMS ***

          bundler (0.9.25)
          rake (0.8.7, 0.8.5)
     ...
}
          rsrails$ gem list
          *** LOCAL GEMS ***

          bundler (0.9.25)
          rake (0.8.7, 0.8.5)
     ...
}
          rsrails$ gem list
          *** LOCAL GEMS ***

          bundler (0.9.25)
          rake (0.8.7, 0.8.5)
     ...
rsrails$ gem list
                 rake (0.8.7, 0.8.5)
                 thor (0.13.6)




Carlos Antonio                  ...
rsrails$ gem list
                 rake (0.8.7, 0.8.5)
                 thor (0.13.6)



                 # Gemfile
      ...
rsrails$ gem list
                 rake (0.8.7, 0.8.5)
                 thor (0.13.6)



                 # Gemfile
      ...
rsrails$ gem list
                 rake (0.8.7, 0.8.5)
                 thor (0.13.6)



                 # Gemfile
      ...
rsrails$ gem list
                 rake (0.8.7, 0.8.5)
                 thor (0.13.6)



                 # Gemfile
      ...
rsrails$ gem list
                 rake (0.8.7, 0.8.5)
                 thor (0.13.6)



                 # Gemfile
      ...
Packaging System
                        OMG!




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
 ...
Router
                 Nova API



Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Rotas root
  Rails 2.3

                 map.root :controller => "welcome"




  Rails 3
                    root :to => "...
Rotas comuns
  Rails 2.3

 map.connect "products/:id", :controller=> "catalog", :action => "view"




  Rails 3
          ...
Rotas nomeadas
  Rails 2.3
        map.purchase "products/:id/purchase", :controller => "catalog",
           :action => "...
Resources com member e
                 collection
  Rails 2.3

         map.resources :products, :member => { :short => :...
Router e Rack FTW!




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Router e Rack FTW!




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Router e Rack FTW!
                 match "posts/:echo", :to => "posts#show"




Carlos Antonio             blog.plataform...
Router e Rack FTW!
                 match "posts/:echo", :to => "posts#show"

                                            ...
Router e Rack FTW!
                    match "posts/:echo", :to => "posts#show"



         match "posts/:echo", :to => Po...
Router e Rack FTW!
                    match "posts/:echo", :to => "posts#show"



         match "posts/:echo", :to => Po...
Router e Rack FTW!
                    match "posts/:echo", :to => "posts#show"



         match "posts/:echo", :to => Po...
100% compatível
           com Rack
                        OMG!




Carlos Antonio   blog.plataformatec.com.br   @cantoni...
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
 ...
ActionMailer
                 rsrails$ ls -lp app/
                   controllers/
                   helpers/
           ...
ActionMailer
                 rsrails$ ls -lp app/
                   controllers/
                   helpers/
           ...
ActionMailer
                  Nova API



Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
TMail




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
TMail

                       Mail



Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
ActionMailer nova API
           class Notifier < ActionMailer::Base
             default :from => "system@example.com"

 ...
ActionMailer nova API
           class Notifier < ActionMailer::Base             Defaults
             default :from => "s...
ActionMailer nova API
            class Notifier < ActionMailer::Base             Defaults
Variáveis     default :from => ...
ActionMailer nova API
            class Notifier < ActionMailer::Base               Defaults
Variáveis     default :from =...
ActionMailer nova API
            class Notifier < ActionMailer::Base               Defaults
Variáveis     default :from =...
AbstractController::Base




                                                 ActionController::Metal




       ActionMai...
Menos coisas para
        lembrar
                        OMG!




Carlos Antonio   blog.plataformatec.com.br   @cantoniod...
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
 ...
ActiveModel




Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
ActiveModel
• Google     Summer of Code 2009:




Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
ActiveModel
• Google     Summer of Code 2009:

  • Extrair a lógica comum entre ActiveRecord e
     ActiveResource




Car...
ActiveModel
• Google     Summer of Code 2009:

  • Extrair a lógica comum entre ActiveRecord e
     ActiveResource

• Hoje...
ActiveModel
• Google     Summer of Code 2009:

  • Extrair a lógica comum entre ActiveRecord e
     ActiveResource

• Hoje...
ActiveModel
• Google     Summer of Code 2009:

  • Extrair a lógica comum entre ActiveRecord e
     ActiveResource

• Hoje...
ActiveResource::Base +
                      ActiveModel
                 module ActiveResource
                   ...
   ...
ActiveRecord::Base +
                     ActiveModel
         Base.class_eval do
             ...
             extend Act...
MyApp + ActiveModel
                 class Person
                   include ActiveModel::Validations

                   ...
Agnosticismo de ORM




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Agnosticismo de ORM

                        Agnosticismo de ORM


                   ActiveModel               Rails::Rai...
Agnosticismo de ORM

                        Agnosticismo de ORM


                   ActiveModel               Rails::Rai...
Agnosticismo de ORM

                        Agnosticismo de ORM


                   ActiveModel               Rails::Rai...
ActiveModel
                                    Validations


                                    Callbacks


            ...
ActiveModel::Lint::Tests




Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva
module ActiveModel
               module Lint
                 module Tests

                   def   test_to_key; end
   ...
ActiveRecord-like
                            Ótimo exemplo de uso do ActiveModel



    http://github.com/plataformatec/m...
Menos hacks!
                 Reusabilidade
                            OMG!




Carlos Antonio       blog.plataformatec.c...
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
 ...
Nova API

                 select                  joins
                 where                   includes
               ...
Nova API
  Rails 2.3

       Post.find(:all, :order => "published_at desc", :limit => 10)




  Rails 3

                 ...
Nova API
  Rails 2.3
          Post.all(:conditions => ["published_at <= ?", Time.now],
                   :include => :co...
Lazy loading
  Rails 2.3
             Job.find(:all, :conditions => {:published => true})


                 Faz um query ...
Lazy loading
  # app/controllers/jobs_controller.rb
  class JobsController < ApplicationController
    def index
      @jo...
Lazy loading
  # app/controllers/jobs_controller.rb
  class JobsController < ApplicationController
    def index
      @jo...
Lazy loading
  # app/controllers/jobs_controller.rb
  class JobsController < ApplicationController
    def index
      @jo...
Lazy loading
  # app/controllers/jobs_controller.rb
  class JobsController < ApplicationController
    def index
      @jo...
Chainability:
            it “quacks” like named_scope


         cars = Car.where(:colour => 'black')
         black_fanc...
Chainability:
            it “quacks” like named_scope

           ActiveRecord::Relation

         cars = Car.where(:colo...
Chainability:
            it “quacks” like named_scope

           ActiveRecord::Relation

         cars = Car.where(:colo...
Falando em named_scope...
 class Post < ActiveRecord::Base
   has_many :comments

   scope :published, where('posts.publis...
Falando em named_scope...
 class Post < ActiveRecord::Base
   has_many :comments

   scope :published, where('posts.publis...
Falando em named_scope...
 class Post < ActiveRecord::Base
   has_many :comments

   scope :published, where('posts.publis...
Falando em named_scope...
 class Post < ActiveRecord::Base
   has_many :comments

   scope :published, where('posts.publis...
Falando em named_scope...
 class Post < ActiveRecord::Base
   has_many :comments

   scope :published, where('posts.publis...
Mas e sobre o ARel
                  que tanto se fala?



Carlos Antonio        blog.plataformatec.com.br   @cantoniodasi...
ARel == Relational Algebra
    ARel != ActiveRecord::Relation



Carlos Antonio   blog.plataformatec.com.br   @cantoniodas...
Código mais limpo
                        OMG!




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
 ...
Rails 2.3

      def index
        @users = User.all
        respond_to do |format|
          format.html # index.html.erb...
Rails 2.3

      def index
        @users = User.all
        respond_to do |format|
          format.html # index.html.erb...
Rails 3.0

                 respond_to :html, :xml

                 def index
                   @users = User.all
      ...
Rails 3.0

                 respond_to :html, :xml

                 def index
                   @users = User.all
      ...
3 variáveis

                 Formato do request

                    Verbo HTTP

                  Status do recurso




...
Rails 2.3
        def create
          @user = User.new(params[:user])
          respond_to do |format|
            if @us...
Rails 3.0

    def create
      @user = User.new(params[:user])
      flash[:notice] = 'User was successfully created' if ...
respond_with(@users)

                 ActionController::Responder




                      Formato do request
          ...
respond_with(@users)

                 ActionController::Responder


                                       to_code


    ...
Responders Customizados




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
github.com/plataformatec/responders




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
github.com/plataformatec/responders

FlashResponder: seta o flash baseado no controller,
na action e no status do recurso

...
github.com/plataformatec/responders

FlashResponder: seta o flash baseado no controller,
na action e no status do recurso

...
github.com/plataformatec/responders

FlashResponder: seta o flash baseado no controller,
na action e no status do recurso

...
DRY
                        OMG!




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
 ...
Unobtrusive Javascript: Rails 2.3
 remote_form_for(@post)




 link_to 'Destroy', post, :confirm => 'Are you sure?',:metho...
Unobtrusive Javascript: Rails 2.3
 remote_form_for(@post)
 <form action="/posts" class="new_post" id="new_post" method="po...
Unobtrusive Javascript: Rails 2.3
 remote_form_for(@post)
 <form action="/posts" class="new_post" id="new_post" method="po...
Unobtrusive Javascript: Rails 3

 form_for(@posts, :remote => true)




<form action="/posts" class="new_post" data-remote...
Unobtrusive Javascript: Rails 3

 form_for(@posts, :remote => true)




<form action="/posts" class="new_post" data-remote...
Unobtrusive Javascript: Rails 3

link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete




<a href="/po...
Unobtrusive Javascript: Rails 3

link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete




<a href="/po...
JS para todos os gostos
      • Prototype: default

      • jQuery: http://github.com/rails/jquery-ujs

      • MooTools: ...
Javascript no Rails 3




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
Javascript no Rails 3


                    Agnosticismo de Javascript


HTML 5 custom data attributes          JS driver ...
Helpers Deprecados no Rails 3
                  • link_to_remote
                  • observe_field
                  • form...
Agnosticismo +
             HTML 5
                 OMG! JQUERY!




Carlos Antonio   blog.plataformatec.com.br   @cantoni...
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
 ...
XSS protection
                 Rails 2.3: unsafe por default
       <%= @job.title %>                     <%= h @job.titl...
XSS protection
                 Rails 2.3: unsafe por default
       <%= @job.title %>                     <%= h @job.titl...
XSS protection
                 Rails 2.3: unsafe por default
       <%= @job.title %>                     <%= h @job.titl...
Helpers que retornam HTML
                 module ApplicationHelper
                   def strong(content)
               ...
Helpers que retornam HTML
                 module ApplicationHelper
                   def strong(content)
               ...
Helpers que retornam HTML
                 module ApplicationHelper
                   def strong(content)
               ...
Segurança
                          OMG!




Carlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
 ...
Agora... como eu começo
           a usar tudo isso que está
             disponível no Rails 3?


Carlos Antonio     blog...
Para começar

                 rsrails$ gem install rails --pre

                 ...
                 Successfully instal...
Para atualizar




Carlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
Para atualizar
      • rails    upgrade plugin:
         • http://github.com/rails/rails_upgrade




Carlos Antonio       ...
Para atualizar
      • rails    upgrade plugin:
         • http://github.com/rails/rails_upgrade

      • rails    upgrade...
Para atualizar
      • rails    upgrade plugin:
         • http://github.com/rails/rails_upgrade

      • rails    upgrade...
?!                           Tem muito mais aqui!

                      http://github.com/plataformatec




Carlos Antoni...
?!                           Tem muito mais aqui!

                      http://github.com/plataformatec




   ID        ...
Upcoming SlideShare
Loading in …5
×

Rails 3 - RS on Rails - 21aug2010

3,681 views

Published on

Palestra realizada por Carlos Antônio (@cantoniodasilva) no evento RS on Rails, em 21 de Agosto de 2010 na cidade de Porto Alegre.

  • Be the first to comment

Rails 3 - RS on Rails - 21aug2010

  1. 1. Rails 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  2. 2. Rails 3 ID blog twitter Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  3. 3. Quem sou eu? • Carlos Antonio da Silva • Desenvolvedor Ruby e Rails há mais de 2 anos • Engenheiro da Plataforma Tecnologia a 1 ano Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  4. 4. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  5. 5. Desenvolvimento de aplicações em Rails Coaching em Consultoria Rails e Agile Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  6. 6. Rails 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  7. 7. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  8. 8. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  9. 9. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  10. 10. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  11. 11. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  12. 12. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  13. 13. Vantagens do Rails 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  14. 14. Vantagens do Rails 3 Performance Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  15. 15. Vantagens do Rails 3 Modularidade Performance Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  16. 16. Vantagens do Rails 3 Agnosticismo Modularidade Performance Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  17. 17. Arquitetura Rails ActionDispatch ActiveSupport Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  18. 18. Arquitetura Todo o resto são Railties! Rails ActionDispatch ActiveSupport Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  19. 19. Arquitetura Todo o resto são Railties! ActiveRecord Rails ActionView ActionDispatch outros... ActiveSupport ActionController ActionMailer Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  20. 20. Como o Rails 3 muda o modo como desenvolvemos? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  21. 21. rails command Rails 2.3 Rails 3 rails blog rails new blog Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  22. 22. rails command Rails 2.3 Rails 3 ruby script/server rails server ruby script/console rails console ruby script/generate rails generate ruby script/dbconsole rails dbconsole Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  23. 23. rails command Rails 3 Shortcuts! rails server rails s rails console rails c rails generate rails g rails dbconsole rails db Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  24. 24. blog/config.ru require ::File.expand_path('../config/environment', __FILE__) run Blog::Application Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  25. 25. blog/config.ru require ::File.expand_path('../config/environment', __FILE__) run Blog::Application Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  26. 26. blog/config/application.rb require File.expand_path('../boot', __FILE__) require 'rails/all' Bundler.require(:default, Rails.env) if defined?(Bundler) module Blog class Application < Rails::Application config.encoding = "utf-8" config.filter_parameters += [:password] end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  27. 27. blog/config/application.rb require File.expand_path('../boot', __FILE__) require 'rails/all' Bundler.require(:default, Rails.env) if defined?(Bundler) module Blog uma Rack App! class Application < Rails::Application config.encoding = "utf-8" config.filter_parameters += [:password] end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  28. 28. O que é uma Rack App? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  29. 29. O que é uma Rack App? Qualquer objeto que responde ao método call, retornando um array com três parâmetros: o response status, os headers e o body, que por sua vez deve responder ao método each. Rack App! lambda { |env| [ 200, {“Content-Type” => “plain/text”}, ["Hello!"] ] } Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  30. 30. blog/config/application.rb require File.expand_path('../boot', __FILE__) require 'rails/all' Bundler.require(:default, Rails.env) if defined?(Bundler) module Blog uma Rack App! class Application < Rails::Application config.encoding = "utf-8" config.filter_parameters += [:password] end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  31. 31. blog/config/application.rb require File.expand_path('../boot', __FILE__) require 'rails/all' Bundler.require(:default, Rails.env) if defined?(Bundler) module Blog class Application < Rails::Application config.encoding = "utf-8" config.filter_parameters += [:password] end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  32. 32. blog/config/boot.rb require 'rubygems' # Set up gems listed in the Gemfile. gemfile = File.expand_path('../../Gemfile', __FILE__) begin ENV['BUNDLE_GEMFILE'] = gemfile require 'bundler' Bundler.setup rescue Bundler::GemNotFound => e STDERR.puts e.message STDERR.puts "Try running `bundle install`." exit! end if File.exist?(gemfile) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  33. 33. blog/config/boot.rb require 'rubygems' # Set up gems listed in the Gemfile. gemfile = File.expand_path('../../Gemfile', __FILE__) begin ENV['BUNDLE_GEMFILE'] = gemfile require 'bundler' Bundler.setup rescue Bundler::GemNotFound => e STDERR.puts e.message STDERR.puts "Try running `bundle install`." exit! end if File.exist?(gemfile) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  34. 34. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  35. 35. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  36. 36. Biblioteca para gerenciamento de dependências Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  37. 37. Rubygems Resolução de dependências rsrails$ gem dependency actionpack -v="2.3.5" Gem actionpack-2.3.5 activesupport (= 2.3.5, runtime) rack (~> 1.0.0, runtime) rsrails$ gem dependency thin Gem thin-1.2.7 daemons (>= 1.0.9, runtime) eventmachine (>= 0.12.6, runtime) rack (>= 1.0.0, runtime) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  38. 38. Rubygems Resolução de dependências rsrails$ gem dependency actionpack -v="2.3.5" Gem actionpack-2.3.5 activesupport (= 2.3.5, runtime) rack (~> 1.0.0, runtime) rsrails$ gem dependency thin Gem thin-1.2.7 daemons (>= 1.0.9, runtime) eventmachine (>= 0.12.6, runtime) rack (>= 1.0.0, runtime) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  39. 39. Rubygems Resolução de dependências Gems instaladas do rack: require "rubygems" * rack (1.0.1) require "thin" * rack (1.1.0) gem "actionpack", "2.3.5" Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  40. 40. Rubygems Resolução de dependências Gems instaladas do rack: require "rubygems" * rack (1.0.1) require "thin" * rack (1.1.0) gem "actionpack", "2.3.5" BOOM!!! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  41. 41. Rubygems Resolução de dependências Gems instaladas do rack: require "rubygems" * rack (1.0.1) require "thin" * rack (1.1.0) gem "actionpack", "2.3.5" can't activate rack (~> 1.0.0, runtime) for ["actionpack-2.3.5"], already activated rack-1.1.0 for ["thin-1.2.7"] (Gem::LoadError) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  42. 42. Rubygems Resolução de dependências Gems instaladas do rack: require "rubygems" * rack (1.0.1) require "thin" * rack (1.1.0) gem "actionpack", "2.3.5" can't activate rack (~> 1.0.0, runtime) for ["actionpack-2.3.5"], already activated rack-1.1.0 for ["thin-1.2.7"] (Gem::LoadError) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  43. 43. Rubygems Resolução de dependências Gems instaladas do rack: require "rubygems" * rack (1.0.1) require "thin" * rack (1.1.0) gem "actionpack", "2.3.5" can't activate rack (~> 1.0.0, runtime) for ["actionpack-2.3.5"], already activated rack-1.1.0 for ["thin-1.2.7"] (Gem::LoadError) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  44. 44. Bundler: Gemfile # Gemfile gem "thin" gem "actionpack", "2.3.5" Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  45. 45. Bundler: Gemfile # Gemfile gem "thin" gem "actionpack", "2.3.5" rsrails$ bundle list Gems included by the bundle: * actionpack (2.3.5) * activesupport (2.3.5) * daemons (1.0.10) * eventmachine (0.12.10) * rack (1.0.1) * thin (1.2.7) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  46. 46. Bundler: Gemfile # Gemfile gem "thin" gem "actionpack", "2.3.5" rsrails$ bundle list Gems included by the bundle: * actionpack (2.3.5) * activesupport (2.3.5) * daemons (1.0.10) * eventmachine (0.12.10) * rack (1.0.1) * thin (1.2.7) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  47. 47. Rubygems $LOAD_PATH Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  48. 48. } rsrails$ gem list *** LOCAL GEMS *** bundler (0.9.25) rake (0.8.7, 0.8.5) Filesystem rdoc (2.5.8) thor (0.13.6) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  49. 49. } rsrails$ gem list *** LOCAL GEMS *** bundler (0.9.25) rake (0.8.7, 0.8.5) Filesystem rdoc (2.5.8) thor (0.13.6) # Rubygems gem “rake”, “0.8.5” } Gemfile Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  50. 50. } rsrails$ gem list *** LOCAL GEMS *** bundler (0.9.25) rake (0.8.7, 0.8.5) Filesystem rdoc (2.5.8) thor (0.13.6) # Rubygems gem “rake”, “0.8.5” } Gemfile } bundler (0.9.25) rake (0.8.7, 0.8.5) $LOAD_PATH rdoc (2.5.8) thor (0.13.6) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  51. 51. Bundler Lock no $LOAD_PATH Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  52. 52. Esqueci de colocar no config.gem! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  53. 53. Esqueci de colocar no config.gem! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  54. 54. } rsrails$ gem list *** LOCAL GEMS *** bundler (0.9.25) rake (0.8.7, 0.8.5) Filesystem rdoc (2.5.8) thor (0.13.6) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  55. 55. } rsrails$ gem list *** LOCAL GEMS *** bundler (0.9.25) rake (0.8.7, 0.8.5) Filesystem rdoc (2.5.8) thor (0.13.6) # Gemfile - Bundler gem “rake”, “0.8.5” } Gemfile Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  56. 56. } rsrails$ gem list *** LOCAL GEMS *** bundler (0.9.25) rake (0.8.7, 0.8.5) Filesystem rdoc (2.5.8) thor (0.13.6) # Gemfile - Bundler gem “rake”, “0.8.5” } Gemfile rake-0.8.5 } $LOAD_PATH Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  57. 57. rsrails$ gem list rake (0.8.7, 0.8.5) thor (0.13.6) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  58. 58. rsrails$ gem list rake (0.8.7, 0.8.5) thor (0.13.6) # Gemfile gem "rake" Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  59. 59. rsrails$ gem list rake (0.8.7, 0.8.5) thor (0.13.6) # Gemfile gem "rake" # test_load_path_lock.rb require "rubygems" require "bundler" Bundler.setup require "rake" require "thor" Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  60. 60. rsrails$ gem list rake (0.8.7, 0.8.5) thor (0.13.6) # Gemfile gem "rake" # test_load_path_lock.rb require "rubygems" require "bundler" Bundler.setup Lock no $LOAD_PATH require "rake" require "thor" Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  61. 61. rsrails$ gem list rake (0.8.7, 0.8.5) thor (0.13.6) # Gemfile gem "rake" # test_load_path_lock.rb require "rubygems" require "bundler" Bundler.setup Lock no $LOAD_PATH require "rake" require "thor" rsrails$ ruby test_load_path_lock.rb test_load_path_lock.rb:6:in `require': no such file to load -- thor (LoadError) from test_load_path_lock.rb:6 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  62. 62. rsrails$ gem list rake (0.8.7, 0.8.5) thor (0.13.6) # Gemfile gem "rake" # test_load_path_lock.rb require "rubygems" require "bundler" Bundler.setup Lock no $LOAD_PATH require "rake" require "thor" rsrails$ ruby test_load_path_lock.rb test_load_path_lock.rb:6:in `require': no such file to load -- thor (LoadError) from test_load_path_lock.rb:6 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  63. 63. Packaging System OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  64. 64. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  65. 65. Router Nova API Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  66. 66. Rotas root Rails 2.3 map.root :controller => "welcome" Rails 3 root :to => "welcome#index" Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  67. 67. Rotas comuns Rails 2.3 map.connect "products/:id", :controller=> "catalog", :action => "view" Rails 3 match 'products/:id' => 'catalog#view' Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  68. 68. Rotas nomeadas Rails 2.3 map.purchase "products/:id/purchase", :controller => "catalog", :action => "purchase" Rails 3 match "products/:id/purchase" => 'catalog#purchase', :as => :purchase Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  69. 69. Resources com member e collection Rails 2.3 map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get } Rails 3 resources :products do member do get :short post :toggle end get :sold, :on => :collection end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  70. 70. Router e Rack FTW! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  71. 71. Router e Rack FTW! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  72. 72. Router e Rack FTW! match "posts/:echo", :to => "posts#show" Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  73. 73. Router e Rack FTW! match "posts/:echo", :to => "posts#show" Rack App! match "posts/:echo", :to => PostsController.action(:show) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  74. 74. Router e Rack FTW! match "posts/:echo", :to => "posts#show" match "posts/:echo", :to => PostsController.action(:show) Rack App! match "/posts/:echo" => redirect("/foo/%{echo}") Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  75. 75. Router e Rack FTW! match "posts/:echo", :to => "posts#show" match "posts/:echo", :to => PostsController.action(:show) match "/posts/:echo" => redirect("/foo/%{echo}") Rack App! match "posts/:echo" => lambda { |env| [ 200, {“Content-Type” => “plain/text”}, ["Echo!"] ] } Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  76. 76. Router e Rack FTW! match "posts/:echo", :to => "posts#show" match "posts/:echo", :to => PostsController.action(:show) match "/posts/:echo" => redirect("/foo/%{echo}") match "posts/:echo" => lambda { |env| [ 200, {“Content-Type” => “plain/text”}, ["Echo!"] ] } Rack App! match "posts/:echo" => MySinatraBlog Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  77. 77. 100% compatível com Rack OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  78. 78. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  79. 79. ActionMailer rsrails$ ls -lp app/ controllers/ helpers/ mailers/ models/ views/ rsrails$ rails g mailer Notifier signup_notification create app/mailers/notifier.rb invoke erb create app/views/notifier create app/views/notifier/signup_notification.text.erb invoke test_unit create test/functional/notifier_test.rb Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  80. 80. ActionMailer rsrails$ ls -lp app/ controllers/ helpers/ mailers com diretório próprio mailers/ models/ views/ rsrails$ rails g mailer Notifier signup_notification create app/mailers/notifier.rb invoke erb create app/views/notifier create app/views/notifier/signup_notification.text.erb invoke test_unit create test/functional/notifier_test.rb Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  81. 81. ActionMailer Nova API Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  82. 82. TMail Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  83. 83. TMail Mail Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  84. 84. ActionMailer nova API class Notifier < ActionMailer::Base default :from => "system@example.com" def signup_notification(recipient) @account = recipient attachments['image.jpg'] = File.read("image.jpg") mail(:to => recipient.email) do |format| format.html format.text end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  85. 85. ActionMailer nova API class Notifier < ActionMailer::Base Defaults default :from => "system@example.com" def signup_notification(recipient) @account = recipient attachments['image.jpg'] = File.read("image.jpg") mail(:to => recipient.email) do |format| format.html format.text end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  86. 86. ActionMailer nova API class Notifier < ActionMailer::Base Defaults Variáveis default :from => "system@example.com" de instância def signup_notification(recipient) @account = recipient attachments['image.jpg'] = File.read("image.jpg") mail(:to => recipient.email) do |format| format.html format.text end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  87. 87. ActionMailer nova API class Notifier < ActionMailer::Base Defaults Variáveis default :from => "system@example.com" de instância def signup_notification(recipient) Attachments tipo @account = recipient cookies attachments['image.jpg'] = File.read("image.jpg") mail(:to => recipient.email) do |format| format.html format.text end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  88. 88. ActionMailer nova API class Notifier < ActionMailer::Base Defaults Variáveis default :from => "system@example.com" de instância def signup_notification(recipient) Attachments tipo @account = recipient cookies attachments['image.jpg'] = File.read("image.jpg") mail(:to => recipient.email) do |format| format.html format.text end end mail tipo respond_to do |format| end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  89. 89. AbstractController::Base ActionController::Metal ActionMailer::Base ActionController::Base Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  90. 90. Menos coisas para lembrar OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  91. 91. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  92. 92. ActiveModel Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  93. 93. ActiveModel • Google Summer of Code 2009: Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  94. 94. ActiveModel • Google Summer of Code 2009: • Extrair a lógica comum entre ActiveRecord e ActiveResource Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  95. 95. ActiveModel • Google Summer of Code 2009: • Extrair a lógica comum entre ActiveRecord e ActiveResource • Hoje Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  96. 96. ActiveModel • Google Summer of Code 2009: • Extrair a lógica comum entre ActiveRecord e ActiveResource • Hoje • Desempenha papel no agnosticismo de ORM Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  97. 97. ActiveModel • Google Summer of Code 2009: • Extrair a lógica comum entre ActiveRecord e ActiveResource • Hoje • Desempenha papel no agnosticismo de ORM • Permite a criação de models à la ActiveRecord Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  98. 98. ActiveResource::Base + ActiveModel module ActiveResource ... class Base extend ActiveModel::Naming include CustomMethods, Observing, Validations include ActiveModel::Conversion include ActiveModel::Serializers::JSON include ActiveModel::Serializers::Xml end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  99. 99. ActiveRecord::Base + ActiveModel Base.class_eval do ... extend ActiveModel::Naming ... include ActiveModel::Conversion include Validations ... include ActiveModel::MassAssignmentSecurity include Callbacks, ActiveModel::Observing, Timestamp end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  100. 100. MyApp + ActiveModel class Person include ActiveModel::Validations attr_accessor :name, :age validates_presence_of :name, :age end >> p = Person.new => #<Person:0x102623588> >> p.valid? => false >> p.errors.full_messages => ["Name can't be blank", "Age can't be blank"] Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  101. 101. Agnosticismo de ORM Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  102. 102. Agnosticismo de ORM Agnosticismo de ORM ActiveModel Rails::Railtie Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  103. 103. Agnosticismo de ORM Agnosticismo de ORM ActiveModel Rails::Railtie Provê uma API para que o ActionPack possa conversar com o ORM Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  104. 104. Agnosticismo de ORM Agnosticismo de ORM ActiveModel Rails::Railtie Provê uma API para que o Integração do ORM com o Rails ActionPack possa conversar com o ORM Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  105. 105. ActiveModel Validations Callbacks Serialization ActiveRecord Data Mapper MongoDB MeuModel Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  106. 106. ActiveModel::Lint::Tests Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  107. 107. module ActiveModel module Lint module Tests def test_to_key; end def test_to_param; end def test_valid?; end def test_persisted?; end def test_model_naming; end def test_errors_aref; end def test_errors_full_messages; end end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  108. 108. ActiveRecord-like Ótimo exemplo de uso do ActiveModel http://github.com/plataformatec/mail_form Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  109. 109. Menos hacks! Reusabilidade OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  110. 110. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  111. 111. Nova API select joins where includes order group limit having offset lock from readonly Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  112. 112. Nova API Rails 2.3 Post.find(:all, :order => "published_at desc", :limit => 10) Rails 3 Post.order("published_at desc").limit(10) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  113. 113. Nova API Rails 2.3 Post.all(:conditions => ["published_at <= ?", Time.now], :include => :comments) Rails 3 Post.where("published_at <= ?", Time.now).includes(:comments) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  114. 114. Lazy loading Rails 2.3 Job.find(:all, :conditions => {:published => true}) Faz um query no DB imediatamente e retorna um array de Jobs Rails 3 Job.where(:published => true) Não faz query no DB, retorna um ActiveRecord::Relation Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  115. 115. Lazy loading # app/controllers/jobs_controller.rb class JobsController < ApplicationController def index @jobs = Jobs.where(:published => true).order("created_at DESC") end end # app/views/jobs/index.html.erb <% cache do %> <% @jobs.each do |job| %> ... <% end %> <% end %> Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  116. 116. Lazy loading # app/controllers/jobs_controller.rb class JobsController < ApplicationController def index @jobs = Jobs.where(:published => true).order("created_at DESC") end end Não realiza query no DB # app/views/jobs/index.html.erb <% cache do %> <% @jobs.each do |job| %> ... <% end %> <% end %> Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  117. 117. Lazy loading # app/controllers/jobs_controller.rb class JobsController < ApplicationController def index @jobs = Jobs.where(:published => true).order("created_at DESC") end end Não realiza query no DB # app/views/jobs/index.html.erb <% cache do %> <% @jobs.each do |job| %> ... <% end %> <% end %> Só aqui que será feito a query no DB Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  118. 118. Lazy loading # app/controllers/jobs_controller.rb class JobsController < ApplicationController def index @jobs = Jobs.where(:published => true).order("created_at DESC") end end Não realiza query no DB # app/views/jobs/index.html.erb <% cache do %> Se estiver cacheado, a query <% @jobs.each do |job| %> não é disparada! ... <% end %> <% end %> Só aqui que será feito a query no DB Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  119. 119. Chainability: it “quacks” like named_scope cars = Car.where(:colour => 'black') black_fancy_cars = cars.order('cars.price DESC').limit(10) black_cheap_cart = cars.order('cars.price ASC').limit(10) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  120. 120. Chainability: it “quacks” like named_scope ActiveRecord::Relation cars = Car.where(:colour => 'black') black_fancy_cars = cars.order('cars.price DESC').limit(10) black_cheap_cart = cars.order('cars.price ASC').limit(10) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  121. 121. Chainability: it “quacks” like named_scope ActiveRecord::Relation cars = Car.where(:colour => 'black') black_fancy_cars = cars.order('cars.price DESC').limit(10) black_cheap_cart = cars.order('cars.price ASC').limit(10) Reaproveitar uma Relation e encadear mais finders Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  122. 122. Falando em named_scope... class Post < ActiveRecord::Base has_many :comments scope :published, where('posts.published_at is not null') scope :recent, published.order("posts.published_at desc").limit(10) end class Comment < ActiveRecord::Base belongs_to :post scope :from_published_posts, joins(:post) & Post.published end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  123. 123. Falando em named_scope... class Post < ActiveRecord::Base has_many :comments scope :published, where('posts.published_at is not null') scope :recent, published.order("posts.published_at desc").limit(10) end class Comment < ActiveRecord::Base belongs_to :post scope :from_published_posts, joins(:post) & Post.published end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  124. 124. Falando em named_scope... class Post < ActiveRecord::Base has_many :comments scope :published, where('posts.published_at is not null') scope :recent, published.order("posts.published_at desc").limit(10) end class Comment < ActiveRecord::Base belongs_to :post scope :from_published_posts, joins(:post) & Post.published end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  125. 125. Falando em named_scope... class Post < ActiveRecord::Base has_many :comments scope :published, where('posts.published_at is not null') scope :recent, published.order("posts.published_at desc").limit(10) end class Comment < ActiveRecord::Base belongs_to :post scope :from_published_posts, joins(:post) & Post.published end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  126. 126. Falando em named_scope... class Post < ActiveRecord::Base has_many :comments scope :published, where('posts.published_at is not null') scope :recent, published.order("posts.published_at desc").limit(10) end class Comment < ActiveRecord::Base DRY belongs_to :post scope :from_published_posts, joins(:post) & Post.published end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  127. 127. Mas e sobre o ARel que tanto se fala? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  128. 128. ARel == Relational Algebra ARel != ActiveRecord::Relation Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  129. 129. Código mais limpo OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  130. 130. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  131. 131. Rails 2.3 def index @users = User.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @users } end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  132. 132. Rails 2.3 def index @users = User.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @users } end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  133. 133. Rails 3.0 respond_to :html, :xml def index @users = User.all respond_with(@users) end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  134. 134. Rails 3.0 respond_to :html, :xml def index @users = User.all respond_with(@users) end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  135. 135. 3 variáveis Formato do request Verbo HTTP Status do recurso Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  136. 136. Rails 2.3 def create @user = User.new(params[:user]) respond_to do |format| if @user.save format.html { redirect_to @user, :notice => 'User was successfully created' } format.xml { render :xml => @user, :status => :created, :location => @user } else format.html { render :action => "new" } format.xml { render :xml => @user.errors, :status => :unprocessable_entity } end end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  137. 137. Rails 3.0 def create @user = User.new(params[:user]) flash[:notice] = 'User was successfully created' if @user.save respond_with(@user) end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  138. 138. respond_with(@users) ActionController::Responder Formato do request Verbo HTTP Status do recurso Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  139. 139. respond_with(@users) ActionController::Responder to_code Formato do request Verbo HTTP Status do recurso Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  140. 140. Responders Customizados Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  141. 141. github.com/plataformatec/responders Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  142. 142. github.com/plataformatec/responders FlashResponder: seta o flash baseado no controller, na action e no status do recurso Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  143. 143. github.com/plataformatec/responders FlashResponder: seta o flash baseado no controller, na action e no status do recurso HttpCacheResponder: adiciona o cabeçalho HTTP Last-Modified para requests de API Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  144. 144. github.com/plataformatec/responders FlashResponder: seta o flash baseado no controller, na action e no status do recurso HttpCacheResponder: adiciona o cabeçalho HTTP Last-Modified para requests de API CollectionResponder: altera o redirecionamento para a action :index ao criar/atualizar um recurso Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  145. 145. DRY OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  146. 146. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  147. 147. Unobtrusive Javascript: Rails 2.3 remote_form_for(@post) link_to 'Destroy', post, :confirm => 'Are you sure?',:method => :delete Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  148. 148. Unobtrusive Javascript: Rails 2.3 remote_form_for(@post) <form action="/posts" class="new_post" id="new_post" method="post" onsubmit="new Ajax.Request('/posts', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;"> link_to 'Destroy', post, :confirm => 'Are you sure?',:method => :delete Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  149. 149. Unobtrusive Javascript: Rails 2.3 remote_form_for(@post) <form action="/posts" class="new_post" id="new_post" method="post" onsubmit="new Ajax.Request('/posts', {asynchronous:true, evalScripts:true, parameters:Form.serialize(this)}); return false;"> link_to 'Destroy', post, :confirm => 'Are you sure?',:method => :delete <a href="/posts/1" onclick="if (confirm('Are you sure?')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'LM2fEF6HuRWdYUZdEumWlemhI6iDPH97pqWhO4jEpiU='); f.appendChild(s);f.submit(); };return false;">Destroy</a> Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  150. 150. Unobtrusive Javascript: Rails 3 form_for(@posts, :remote => true) <form action="/posts" class="new_post" data-remote="true" id="new_post" method="post"> Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  151. 151. Unobtrusive Javascript: Rails 3 form_for(@posts, :remote => true) <form action="/posts" class="new_post" data-remote="true" id="new_post" method="post"> Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  152. 152. Unobtrusive Javascript: Rails 3 link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete <a href="/posts/1" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a> Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  153. 153. Unobtrusive Javascript: Rails 3 link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete <a href="/posts/1" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a> Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  154. 154. JS para todos os gostos • Prototype: default • jQuery: http://github.com/rails/jquery-ujs • MooTools: http://mootools.net/forge/p/rails_3_driver • Você pode fazer o seu! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  155. 155. Javascript no Rails 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  156. 156. Javascript no Rails 3 Agnosticismo de Javascript HTML 5 custom data attributes JS driver para cada framework Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  157. 157. Helpers Deprecados no Rails 3 • link_to_remote • observe_field • form_remote_tag • submit_to_remote • periodically_call_remote • remote_form_for • observe_form • button_to_remote http://github.com/rails/prototype_legacy_helper Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  158. 158. Agnosticismo + HTML 5 OMG! JQUERY! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  159. 159. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  160. 160. XSS protection Rails 2.3: unsafe por default <%= @job.title %> <%= h @job.title %> unsafe safe Rails 3: safe por default <%= @job.title %> <%= raw @job.title %> safe unsafe Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  161. 161. XSS protection Rails 2.3: unsafe por default <%= @job.title %> <%= h @job.title %> unsafe safe Rails 3: safe por default <%= @job.title %> <%= raw @job.title %> safe unsafe Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  162. 162. XSS protection Rails 2.3: unsafe por default <%= @job.title %> <%= h @job.title %> unsafe safe Rails 3: safe por default <%= @job.title %> <%= raw @job.title %> safe unsafe Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  163. 163. Helpers que retornam HTML module ApplicationHelper def strong(content) "<strong>#{h content}</strong>".html_safe end end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  164. 164. Helpers que retornam HTML module ApplicationHelper def strong(content) "<strong>#{h content}</strong>".html_safe end end Dicas: 1. Certificar-se de que todo input está sendo escapado Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  165. 165. Helpers que retornam HTML module ApplicationHelper def strong(content) "<strong>#{h content}</strong>".html_safe end end Dicas: 1. Certificar-se de que todo input está sendo escapado 2. Chamar html_safe no output Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  166. 166. Segurança OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  167. 167. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  168. 168. Agora... como eu começo a usar tudo isso que está disponível no Rails 3? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  169. 169. Para começar rsrails$ gem install rails --pre ... Successfully installed rails-3.0.0.rc 23 gems installed rsrails$ rails -v Rails 3.0.0.rc Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  170. 170. Para atualizar Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  171. 171. Para atualizar • rails upgrade plugin: • http://github.com/rails/rails_upgrade Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  172. 172. Para atualizar • rails upgrade plugin: • http://github.com/rails/rails_upgrade • rails upgrade handbook: • http://www.railsupgradehandbook.com/ Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  173. 173. Para atualizar • rails upgrade plugin: • http://github.com/rails/rails_upgrade • rails upgrade handbook: • http://www.railsupgradehandbook.com/ • screencasts “Upgrading to Rails 3”: • http://railscasts.com/, Episódios #225, #226 e #227 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  174. 174. ?! Tem muito mais aqui! http://github.com/plataformatec Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  175. 175. ?! Tem muito mais aqui! http://github.com/plataformatec ID blog twitter Carlos Antonio blog.plataformatec.com.br @cantoniodasilva

×