SlideShare a Scribd company logo
1 of 175
Download to read offline
Rails 3


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

   ID                      blog                      twitter

Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
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
Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Desenvolvimento de
aplicações em Rails




 Coaching em                                 Consultoria
 Rails e Agile

Carlos Antonio   blog.plataformatec.com.br          @cantoniodasilva
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   @cantoniodasilva
Vantagens do Rails 3



                      Modularidade


                      Performance



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

                      Agnosticismo


                      Modularidade


                      Performance



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

                           Rails

                   ActionDispatch

                   ActiveSupport




Carlos Antonio    blog.plataformatec.com.br   @cantoniodasilva
Arquitetura
                                        Todo o resto são
                                            Railties!
                           Rails

                   ActionDispatch

                   ActiveSupport




Carlos Antonio    blog.plataformatec.com.br      @cantoniodasilva
Arquitetura
                                                Todo o resto são
                                                    Railties!
      ActiveRecord
                                   Rails
                                                       ActionView
                           ActionDispatch

        outros...           ActiveSupport

                                                      ActionController

                    ActionMailer

Carlos Antonio            blog.plataformatec.com.br          @cantoniodasilva
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                                  rails new blog




Carlos Antonio     blog.plataformatec.com.br             @cantoniodasilva
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
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
blog/config.ru


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




Carlos Antonio              blog.plataformatec.com.br         @cantoniodasilva
blog/config.ru


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




Carlos Antonio              blog.plataformatec.com.br         @cantoniodasilva
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
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
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â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
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
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
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
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
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
                 Responders
                 Unobtrusive Javascript
                 XSS Protection



Carlos Antonio      blog.plataformatec.com.br   @cantoniodasilva
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"
                 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
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
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
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
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
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
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
Bundler: Gemfile
                   # Gemfile
                   gem "thin"
                   gem "actionpack", "2.3.5"




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
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
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
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)
                                                     Filesystem
          rdoc (2.5.8)
          thor (0.13.6)




Carlos Antonio                  blog.plataformatec.com.br         @cantoniodasilva
}
          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
}
          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
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)
                                                     Filesystem
          rdoc (2.5.8)
          thor (0.13.6)




Carlos Antonio                  blog.plataformatec.com.br         @cantoniodasilva
}
          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
}
          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
rsrails$ gem list
                 rake (0.8.7, 0.8.5)
                 thor (0.13.6)




Carlos Antonio                         blog.plataformatec.com.br   @cantoniodasilva
rsrails$ gem list
                 rake (0.8.7, 0.8.5)
                 thor (0.13.6)



                 # Gemfile
                 gem "rake"




Carlos Antonio                         blog.plataformatec.com.br   @cantoniodasilva
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
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
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
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
Packaging System
                        OMG!




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
                 Responders
                 Unobtrusive Javascript
                 XSS Protection



Carlos Antonio      blog.plataformatec.com.br   @cantoniodasilva
Router
                 Nova API



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

                 map.root :controller => "welcome"




  Rails 3
                    root :to => "welcome#index"




Carlos Antonio          blog.plataformatec.com.br    @cantoniodasilva
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
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
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
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.plataformatec.com.br        @cantoniodasilva
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
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
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
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
100% compatível
           com Rack
                        OMG!




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
                 Responders
                 Unobtrusive Javascript
                 XSS Protection



Carlos Antonio      blog.plataformatec.com.br   @cantoniodasilva
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
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
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"

             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
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
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
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
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
AbstractController::Base




                                                 ActionController::Metal




       ActionMailer::Base                        ActionController::Base




Carlos Antonio              blog.plataformatec.com.br           @cantoniodasilva
Menos coisas para
        lembrar
                        OMG!




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
                 Responders
                 Unobtrusive Javascript
                 XSS Protection



Carlos Antonio      blog.plataformatec.com.br   @cantoniodasilva
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




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

  • Extrair a lógica comum entre ActiveRecord e
     ActiveResource

• Hoje




Carlos Antonio           blog.plataformatec.com.br   @cantoniodasilva
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
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
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
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
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
Agnosticismo de ORM




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

                        Agnosticismo de ORM


                   ActiveModel               Rails::Railtie




Carlos Antonio            blog.plataformatec.com.br           @cantoniodasilva
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
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
ActiveModel
                                    Validations


                                    Callbacks


                                   Serialization




            ActiveRecord    Data Mapper           MongoDB   MeuModel


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




Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva
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
ActiveRecord-like
                            Ótimo exemplo de uso do ActiveModel



    http://github.com/plataformatec/mail_form




Carlos Antonio       blog.plataformatec.com.br      @cantoniodasilva
Menos hacks!
                 Reusabilidade
                            OMG!




Carlos Antonio       blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
                 Responders
                 Unobtrusive Javascript
                 XSS Protection



Carlos Antonio      blog.plataformatec.com.br   @cantoniodasilva
Nova API

                 select                  joins
                 where                   includes
                 order                   group
                 limit                   having
                 offset                  lock
                 from                    readonly




Carlos Antonio        blog.plataformatec.com.br     @cantoniodasilva
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Mas e sobre o ARel
                  que tanto se fala?



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



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




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
                 Responders
                 Unobtrusive Javascript
                 XSS Protection



Carlos Antonio      blog.plataformatec.com.br   @cantoniodasilva
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
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
Rails 3.0

                 respond_to :html, :xml

                 def index
                   @users = User.all
                   respond_with(@users)
                 end




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

                 respond_to :html, :xml

                 def index
                   @users = User.all
                   respond_with(@users)
                 end




Carlos Antonio        blog.plataformatec.com.br   @cantoniodasilva
3 variáveis

                 Formato do request

                    Verbo HTTP

                  Status do recurso




Carlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
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
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
respond_with(@users)

                 ActionController::Responder




                      Formato do request
                         Verbo HTTP
                       Status do recurso
Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva
respond_with(@users)

                 ActionController::Responder


                                       to_code


                      Formato do request
                         Verbo HTTP
                       Status do recurso
Carlos Antonio          blog.plataformatec.com.br   @cantoniodasilva
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




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

HttpCacheResponder: adiciona o cabeçalho HTTP
Last-Modified para requests de API




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

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
DRY
                        OMG!




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
                 Responders
                 Unobtrusive Javascript
                 XSS Protection



Carlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
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
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
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
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
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
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
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
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
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 para cada framework




Carlos Antonio          blog.plataformatec.com.br        @cantoniodasilva
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
Agnosticismo +
             HTML 5
                 OMG! JQUERY!




Carlos Antonio   blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
                 Responders
                 Unobtrusive Javascript
                 XSS Protection



Carlos Antonio      blog.plataformatec.com.br   @cantoniodasilva
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
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
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
Helpers que retornam HTML
                 module ApplicationHelper
                   def strong(content)
                     "<strong>#{h content}</strong>".html_safe
                   end
                 end




Carlos Antonio                blog.plataformatec.com.br          @cantoniodasilva
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
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
Segurança
                          OMG!




Carlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
Bundler
                 Router
                 ActionMailer
                 ActiveModel
                 ActiveRecord
                 Responders
                 Unobtrusive Javascript
                 XSS Protection



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


Carlos Antonio     blog.plataformatec.com.br   @cantoniodasilva
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
Para atualizar




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




Carlos Antonio                blog.plataformatec.com.br   @cantoniodasilva
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
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
?!                           Tem muito mais aqui!

                      http://github.com/plataformatec




Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva
?!                           Tem muito mais aqui!

                      http://github.com/plataformatec




   ID                                 blog                      twitter

Carlos Antonio               blog.plataformatec.com.br   @cantoniodasilva

More Related Content

Similar to Rails 3 - RS on Rails - 21aug2010

Introducao ao desenvolvimento web com Rails
Introducao ao desenvolvimento web com RailsIntroducao ao desenvolvimento web com Rails
Introducao ao desenvolvimento web com RailsKaton Agência Digital
 
Curso de Ruby on Rails
Curso de Ruby on RailsCurso de Ruby on Rails
Curso de Ruby on RailsCJR, UnB
 
Minicurso Ruby on Rails - Wake Up Systems
Minicurso Ruby on Rails - Wake Up SystemsMinicurso Ruby on Rails - Wake Up Systems
Minicurso Ruby on Rails - Wake Up SystemsWakeUpSystems
 
Workshop Performance Rails
Workshop Performance RailsWorkshop Performance Rails
Workshop Performance RailsVitor Pellegrino
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
Quick introduction to Ruby on Rails
Quick introduction to Ruby on RailsQuick introduction to Ruby on Rails
Quick introduction to Ruby on RailsWhitesmith
 
Ruby and Rails intro
Ruby and Rails introRuby and Rails intro
Ruby and Rails introNuno Silva
 
Começando com Git
Começando com GitComeçando com Git
Começando com GitDaniel Costa
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 
Rails - EXATEC2009
Rails - EXATEC2009Rails - EXATEC2009
Rails - EXATEC2009Caue Guerra
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsJulio Betta
 
[Rock'n Rails] Deploying Rails Applications with Capistrano
[Rock'n Rails] Deploying Rails Applications with Capistrano[Rock'n Rails] Deploying Rails Applications with Capistrano
[Rock'n Rails] Deploying Rails Applications with CapistranoAlmir Mendes
 
Tendências do Mercado de Internet
Tendências do Mercado de InternetTendências do Mercado de Internet
Tendências do Mercado de InternetVanessa Oliveira
 
ruby on rails e o mercado
ruby on rails e o mercadoruby on rails e o mercado
ruby on rails e o mercadoelliando dias
 

Similar to Rails 3 - RS on Rails - 21aug2010 (20)

Introducao ao desenvolvimento web com Rails
Introducao ao desenvolvimento web com RailsIntroducao ao desenvolvimento web com Rails
Introducao ao desenvolvimento web com Rails
 
Curso de Ruby on Rails
Curso de Ruby on RailsCurso de Ruby on Rails
Curso de Ruby on Rails
 
Minicurso Ruby on Rails - Wake Up Systems
Minicurso Ruby on Rails - Wake Up SystemsMinicurso Ruby on Rails - Wake Up Systems
Minicurso Ruby on Rails - Wake Up Systems
 
Workshop Performance Rails
Workshop Performance RailsWorkshop Performance Rails
Workshop Performance Rails
 
Rails na prática
Rails na práticaRails na prática
Rails na prática
 
TDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direitoTDC 2015 - Rails & Javascript: faça isso direito
TDC 2015 - Rails & Javascript: faça isso direito
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Oficial
OficialOficial
Oficial
 
Quick introduction to Ruby on Rails
Quick introduction to Ruby on RailsQuick introduction to Ruby on Rails
Quick introduction to Ruby on Rails
 
Ruby and Rails intro
Ruby and Rails introRuby and Rails intro
Ruby and Rails intro
 
Começando com Git
Começando com GitComeçando com Git
Começando com Git
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
W2py pyconpe
W2py pyconpeW2py pyconpe
W2py pyconpe
 
Rails - EXATEC2009
Rails - EXATEC2009Rails - EXATEC2009
Rails - EXATEC2009
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on Rails
 
[Rock'n Rails] Deploying Rails Applications with Capistrano
[Rock'n Rails] Deploying Rails Applications with Capistrano[Rock'n Rails] Deploying Rails Applications with Capistrano
[Rock'n Rails] Deploying Rails Applications with Capistrano
 
Tendências do Mercado de Internet
Tendências do Mercado de InternetTendências do Mercado de Internet
Tendências do Mercado de Internet
 
Servidores web
Servidores webServidores web
Servidores web
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
ruby on rails e o mercado
ruby on rails e o mercadoruby on rails e o mercado
ruby on rails e o mercado
 

More from Plataformatec

Do your own hacking evening - RubyConf UR
Do your own hacking evening - RubyConf URDo your own hacking evening - RubyConf UR
Do your own hacking evening - RubyConf URPlataformatec
 
Product Owner - Simples como dizem? - Agile Tour 2011
Product Owner - Simples como dizem? - Agile Tour 2011Product Owner - Simples como dizem? - Agile Tour 2011
Product Owner - Simples como dizem? - Agile Tour 2011Plataformatec
 
As reais razões do porque eu devo ser Ágil - Agile Tour São Paulo
As reais razões do porque eu devo ser Ágil - Agile Tour São PauloAs reais razões do porque eu devo ser Ágil - Agile Tour São Paulo
As reais razões do porque eu devo ser Ágil - Agile Tour São PauloPlataformatec
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Plataformatec
 
Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011Plataformatec
 
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010Plataformatec
 
Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010Plataformatec
 
CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010Plataformatec
 
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010Plataformatec
 
Project Rescue - Oxente Rails - 05aug2010
Project Rescue - Oxente Rails - 05aug2010Project Rescue - Oxente Rails - 05aug2010
Project Rescue - Oxente Rails - 05aug2010Plataformatec
 
The Plafatorma Way - Oxente Rails - 05aug2010
The Plafatorma Way - Oxente Rails - 05aug2010The Plafatorma Way - Oxente Rails - 05aug2010
The Plafatorma Way - Oxente Rails - 05aug2010Plataformatec
 
DSL or NoDSL - Euruko - 29may2010
DSL or NoDSL - Euruko - 29may2010DSL or NoDSL - Euruko - 29may2010
DSL or NoDSL - Euruko - 29may2010Plataformatec
 
Classificação de textos - Dev in Sampa - 28nov2009
Classificação de textos - Dev in Sampa - 28nov2009Classificação de textos - Dev in Sampa - 28nov2009
Classificação de textos - Dev in Sampa - 28nov2009Plataformatec
 
Devise - RSLA - 13oct2009
Devise - RSLA - 13oct2009Devise - RSLA - 13oct2009
Devise - RSLA - 13oct2009Plataformatec
 
Thor - RSLA - 13oct2009
Thor - RSLA - 13oct2009Thor - RSLA - 13oct2009
Thor - RSLA - 13oct2009Plataformatec
 

More from Plataformatec (15)

Do your own hacking evening - RubyConf UR
Do your own hacking evening - RubyConf URDo your own hacking evening - RubyConf UR
Do your own hacking evening - RubyConf UR
 
Product Owner - Simples como dizem? - Agile Tour 2011
Product Owner - Simples como dizem? - Agile Tour 2011Product Owner - Simples como dizem? - Agile Tour 2011
Product Owner - Simples como dizem? - Agile Tour 2011
 
As reais razões do porque eu devo ser Ágil - Agile Tour São Paulo
As reais razões do porque eu devo ser Ágil - Agile Tour São PauloAs reais razões do porque eu devo ser Ágil - Agile Tour São Paulo
As reais razões do porque eu devo ser Ágil - Agile Tour São Paulo
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
 
Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011
 
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010
Rails 2.3, 3.0 and 3.1 - RubyConfBR - 26oct2010
 
Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010Rails 3 - The Developers Conference - 21aug2010
Rails 3 - The Developers Conference - 21aug2010
 
CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010CRUDing Open Source - WhyDay - 19aug2010
CRUDing Open Source - WhyDay - 19aug2010
 
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010
O que há de novo no Rails 3 - Ruby on Rails no Mundo Real - 23may2010
 
Project Rescue - Oxente Rails - 05aug2010
Project Rescue - Oxente Rails - 05aug2010Project Rescue - Oxente Rails - 05aug2010
Project Rescue - Oxente Rails - 05aug2010
 
The Plafatorma Way - Oxente Rails - 05aug2010
The Plafatorma Way - Oxente Rails - 05aug2010The Plafatorma Way - Oxente Rails - 05aug2010
The Plafatorma Way - Oxente Rails - 05aug2010
 
DSL or NoDSL - Euruko - 29may2010
DSL or NoDSL - Euruko - 29may2010DSL or NoDSL - Euruko - 29may2010
DSL or NoDSL - Euruko - 29may2010
 
Classificação de textos - Dev in Sampa - 28nov2009
Classificação de textos - Dev in Sampa - 28nov2009Classificação de textos - Dev in Sampa - 28nov2009
Classificação de textos - Dev in Sampa - 28nov2009
 
Devise - RSLA - 13oct2009
Devise - RSLA - 13oct2009Devise - RSLA - 13oct2009
Devise - RSLA - 13oct2009
 
Thor - RSLA - 13oct2009
Thor - RSLA - 13oct2009Thor - RSLA - 13oct2009
Thor - RSLA - 13oct2009
 

Rails 3 - RS on Rails - 21aug2010

  • 1. Rails 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 2. Rails 3 ID blog twitter Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 5. Desenvolvimento de aplicações em Rails Coaching em Consultoria Rails e Agile Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 6. Rails 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 7. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 8. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 9. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 10. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 11. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 12. Como tudo começou? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 13. Vantagens do Rails 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 14. Vantagens do Rails 3 Performance Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 15. Vantagens do Rails 3 Modularidade Performance Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 16. Vantagens do Rails 3 Agnosticismo Modularidade Performance Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 17. Arquitetura Rails ActionDispatch ActiveSupport Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 18. Arquitetura Todo o resto são Railties! Rails ActionDispatch ActiveSupport Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 19. Arquitetura Todo o resto são Railties! ActiveRecord Rails ActionView ActionDispatch outros... ActiveSupport ActionController ActionMailer Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 20. Como o Rails 3 muda o modo como desenvolvemos? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 21. rails command Rails 2.3 Rails 3 rails blog rails new blog Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. blog/config.ru require ::File.expand_path('../config/environment', __FILE__) run Blog::Application Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 25. blog/config.ru require ::File.expand_path('../config/environment', __FILE__) run Blog::Application Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. O que é uma Rack App? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. 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. 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. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 35. Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 36. Biblioteca para gerenciamento de dependências Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. 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. 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. 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. 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. Bundler: Gemfile # Gemfile gem "thin" gem "actionpack", "2.3.5" Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. Rubygems $LOAD_PATH Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. } 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. } 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. Bundler Lock no $LOAD_PATH Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 52. Esqueci de colocar no config.gem! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 53. Esqueci de colocar no config.gem! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. } 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. } 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. rsrails$ gem list rake (0.8.7, 0.8.5) thor (0.13.6) Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. 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. 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. Packaging System OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 64. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 65. Router Nova API Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 66. Rotas root Rails 2.3 map.root :controller => "welcome" Rails 3 root :to => "welcome#index" Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. Router e Rack FTW! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 71. Router e Rack FTW! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 72. Router e Rack FTW! match "posts/:echo", :to => "posts#show" Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. 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. 100% compatível com Rack OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 78. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. ActionMailer Nova API Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 82. TMail Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 83. TMail Mail Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. 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. 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. AbstractController::Base ActionController::Metal ActionMailer::Base ActionController::Base Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 90. Menos coisas para lembrar OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 91. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 92. ActiveModel Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 93. ActiveModel • Google Summer of Code 2009: Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 94. ActiveModel • Google Summer of Code 2009: • Extrair a lógica comum entre ActiveRecord e ActiveResource Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. 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. 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. 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. Agnosticismo de ORM Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 102. Agnosticismo de ORM Agnosticismo de ORM ActiveModel Rails::Railtie Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. ActiveModel Validations Callbacks Serialization ActiveRecord Data Mapper MongoDB MeuModel Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 106. ActiveModel::Lint::Tests Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. ActiveRecord-like Ótimo exemplo de uso do ActiveModel http://github.com/plataformatec/mail_form Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 109. Menos hacks! Reusabilidade OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 110. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 111. Nova API select joins where includes order group limit having offset lock from readonly Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Mas e sobre o ARel que tanto se fala? Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 128. ARel == Relational Algebra ARel != ActiveRecord::Relation Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 129. Código mais limpo OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 130. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. Rails 3.0 respond_to :html, :xml def index @users = User.all respond_with(@users) end Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 3 variáveis Formato do request Verbo HTTP Status do recurso Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. respond_with(@users) ActionController::Responder Formato do request Verbo HTTP Status do recurso Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 139. respond_with(@users) ActionController::Responder to_code Formato do request Verbo HTTP Status do recurso Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 140. Responders Customizados Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 141. github.com/plataformatec/responders Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. DRY OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 146. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. 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. 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. 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. 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. 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. Javascript no Rails 3 Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. Agnosticismo + HTML 5 OMG! JQUERY! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 159. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. 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. 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. 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. 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. Segurança OMG! Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 167. Bundler Router ActionMailer ActiveModel ActiveRecord Responders Unobtrusive Javascript XSS Protection Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. Para atualizar Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 171. Para atualizar • rails upgrade plugin: • http://github.com/rails/rails_upgrade Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 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. 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. ?! Tem muito mais aqui! http://github.com/plataformatec Carlos Antonio blog.plataformatec.com.br @cantoniodasilva
  • 175. ?! Tem muito mais aqui! http://github.com/plataformatec ID blog twitter Carlos Antonio blog.plataformatec.com.br @cantoniodasilva

Editor's Notes

  1. - Vamos falar sobre Rails 3 * Arquitetura, vantagens, novidades, APIs e muito mais - Essa palestra &amp;#xE9; mais focada para desenvolvedores que conhecem Rails 2.3
  2. - Vamos falar sobre Rails 3 * Arquitetura, vantagens, novidades, APIs e muito mais - Essa palestra &amp;#xE9; mais focada para desenvolvedores que conhecem Rails 2.3
  3. - Vamos falar sobre Rails 3 * Arquitetura, vantagens, novidades, APIs e muito mais - Essa palestra &amp;#xE9; mais focada para desenvolvedores que conhecem Rails 2.3
  4. Antes de tudo, quem sou eu?
  5. O que &amp;#xE9; a Plataforma? - Fundada no come&amp;#xE7;o de 2009 - Projetos open source bem conhecidos: Devise - Rails Core: Jos&amp;#xE9; Valim - Gostamos trabalhar sempre procurando o melhor modo de se fazer as coisas
  6. O que &amp;#xE9; a Plataforma? - Fundada no come&amp;#xE7;o de 2009 - Projetos open source bem conhecidos: Devise - Rails Core: Jos&amp;#xE9; Valim - Gostamos trabalhar sempre procurando o melhor modo de se fazer as coisas
  7. O que &amp;#xE9; a Plataforma? - Fundada no come&amp;#xE7;o de 2009 - Projetos open source bem conhecidos: Devise - Rails Core: Jos&amp;#xE9; Valim - Gostamos trabalhar sempre procurando o melhor modo de se fazer as coisas
  8. - Vamos falar sobre Rails 3 * Arquitetura, vantagens, novidades, APIs e muito mais - Essa palestra &amp;#xE9; mais focada para desenvolvedores que conhecem Rails 2.3
  9. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  10. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  11. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  12. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  13. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  14. - Performance: Yehuda Katkz, Merb - Agn&amp;#xF3;stico a ORM, Javascript, template Engine - Modularidade: posso aproveitar hooks em v&amp;#xE1;rios pontos e trocar m&amp;#xF3;dulos &amp;#x201C;internos&amp;#x201D; do Rails pelos meus pr&amp;#xF3;prios
  15. - Performance: Yehuda Katkz, Merb - Agn&amp;#xF3;stico a ORM, Javascript, template Engine - Modularidade: posso aproveitar hooks em v&amp;#xE1;rios pontos e trocar m&amp;#xF3;dulos &amp;#x201C;internos&amp;#x201D; do Rails pelos meus pr&amp;#xF3;prios
  16. - Performance: Yehuda Katkz, Merb - Agn&amp;#xF3;stico a ORM, Javascript, template Engine - Modularidade: posso aproveitar hooks em v&amp;#xE1;rios pontos e trocar m&amp;#xF3;dulos &amp;#x201C;internos&amp;#x201D; do Rails pelos meus pr&amp;#xF3;prios
  17. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  18. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  19. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  20. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  21. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  22. * Rails fornece a estrutura do railties - Rails == Rails::Railtie + Rails::Engine + Rails::Application + Processo de Boot + Rails::Generators + Rake Tasks + Command (server, console) * ActionDispatch: rack on stereoids! * objetos request e respone * roteamento * v&amp;#xE1;rios middlewares
  23. - Digamos que come&amp;#xE7;amos nossa aplica&amp;#xE7;&amp;#xE3;o e vamos inici&amp;#xE1;la - Quem conhece rack, percebeu que minha aplica&amp;#xE7;&amp;#xE3;o agora &amp;#xE9; uma Rack App mesmo, posso at&amp;#xE9; chamar com rackup - Vamos ver onde est&amp;#xE1; definido essa minha rack app Blog::Application
  24. - Blogo::Application herda de RailsApplication - Rails::Application cuida de toda processo de boot da minha aplica&amp;#xE7;&amp;#xE3;o: executar Railties, plugins e engines - Vamos dar uma olhada nesse arquivo que est&amp;#xE1; sendo feito require
  25. - Blogo::Application herda de RailsApplication - Rails::Application cuida de toda processo de boot da minha aplica&amp;#xE7;&amp;#xE3;o: executar Railties, plugins e engines - Vamos dar uma olhada nesse arquivo que est&amp;#xE1; sendo feito require
  26. - Blogo::Application herda de RailsApplication - Rails::Application cuida de toda processo de boot da minha aplica&amp;#xE7;&amp;#xE3;o: executar Railties, plugins e engines - Vamos dar uma olhada nesse arquivo que est&amp;#xE1; sendo feito require
  27. - Blogo::Application herda de RailsApplication - Rails::Application cuida de toda processo de boot da minha aplica&amp;#xE7;&amp;#xE3;o: executar Railties, plugins e engines - Vamos dar uma olhada nesse arquivo que est&amp;#xE1; sendo feito require
  28. - Blogo::Application herda de RailsApplication - Rails::Application cuida de toda processo de boot da minha aplica&amp;#xE7;&amp;#xE3;o: executar Railties, plugins e engines - Vamos dar uma olhada nesse arquivo que est&amp;#xE1; sendo feito require
  29. - Blogo::Application herda de RailsApplication - Rails::Application cuida de toda processo de boot da minha aplica&amp;#xE7;&amp;#xE3;o: executar Railties, plugins e engines - Vamos dar uma olhada nesse arquivo que est&amp;#xE1; sendo feito require
  30. - O arquivo boot.rb tem como responsabilidade basicamente carregar as gems que minha aplica&amp;#xE7;&amp;#xE3;o depende - Agnostico a gerenciador de pacotes
  31. - Em uma linha, isso &amp;#xE9; o que Bundler &amp;#xE9;, mas ele n&amp;#xE3;o &amp;#xE9; s&amp;#xF3; isso. O bundler resolve dois problemas muito importantes: - Resolu&amp;#xE7;&amp;#xE3;o de depend&amp;#xEA;ncias - Lock no $LOAD_PATH
  32. - Em uma linha, isso &amp;#xE9; o que Bundler &amp;#xE9;, mas ele n&amp;#xE3;o &amp;#xE9; s&amp;#xF3; isso. O bundler resolve dois problemas muito importantes: - Resolu&amp;#xE7;&amp;#xE3;o de depend&amp;#xEA;ncias - Lock no $LOAD_PATH
  33. - Em uma linha, isso &amp;#xE9; o que Bundler &amp;#xE9;, mas ele n&amp;#xE3;o &amp;#xE9; s&amp;#xF3; isso. O bundler resolve dois problemas muito importantes: - Resolu&amp;#xE7;&amp;#xE3;o de depend&amp;#xEA;ncias - Lock no $LOAD_PATH
  34. - Imagine que nossa aplica&amp;#xE7;&amp;#xE3;o dependa de duas gems, actionpack e do thin. O nosso gerenciador de pacotes precisa resolver qual vers&amp;#xE3;o de cada gem e de suas depend&amp;#xEA;ncias ele ir&amp;#xE1; usar.
  35. - O thin depende de rack 1.0.x - O actionpack depende de qualquer versao do rack maior que 1.0.0 - O que acontece quando fazemos require das duas? - Rubygems resolve as depend&amp;#xEA;ncias de modo &amp;#x201C;procedural&amp;#x201D;
  36. - O thin depende de rack 1.0.x - O actionpack depende de qualquer versao do rack maior que 1.0.0 - O que acontece quando fazemos require das duas? - Rubygems resolve as depend&amp;#xEA;ncias de modo &amp;#x201C;procedural&amp;#x201D;
  37. - O thin depende de rack 1.0.x - O actionpack depende de qualquer versao do rack maior que 1.0.0 - O que acontece quando fazemos require das duas? - Rubygems resolve as depend&amp;#xEA;ncias de modo &amp;#x201C;procedural&amp;#x201D;
  38. - O thin depende de rack 1.0.x - O actionpack depende de qualquer versao do rack maior que 1.0.0 - O que acontece quando fazemos require das duas? - Rubygems resolve as depend&amp;#xEA;ncias de modo &amp;#x201C;procedural&amp;#x201D;
  39. - O thin depende de rack 1.0.x - O actionpack depende de qualquer versao do rack maior que 1.0.0 - O que acontece quando fazemos require das duas? - Rubygems resolve as depend&amp;#xEA;ncias de modo &amp;#x201C;procedural&amp;#x201D;
  40. - Com o bundler, &amp;#xE9; diferente. Ele analisa todas as gems e suas depend&amp;#xEA;ncias necess&amp;#xE1;rias, e calcula quais vers&amp;#xF5;es que atendem os requisitos do conjunto de gems
  41. - Com o bundler, &amp;#xE9; diferente. Ele analisa todas as gems e suas depend&amp;#xEA;ncias necess&amp;#xE1;rias, e calcula quais vers&amp;#xF5;es que atendem os requisitos do conjunto de gems
  42. Que problema &amp;#xE9; esse do lock no $LOAD_PATH?
  43. Mas como que esse lock no $LOAD_PATH nos ajuda?
  44. Mas como que esse lock no $LOAD_PATH nos ajuda?
  45. Que problema &amp;#xE9; esse do lock no $LOAD_PATH?
  46. - Lembra dessa frase? O Bundler resolveu esse problema para voc&amp;#xEA;!
  47. Mas como que esse lock no $LOAD_PATH nos ajuda?
  48. Mas como que esse lock no $LOAD_PATH nos ajuda?
  49. - It feels like a the controller API - It talks like the controller API - Hey, maybe this is the controller API!
  50. - It feels like a the controller API - It talks like the controller API - Hey, maybe this is the controller API!
  51. - It feels like a the controller API - It talks like the controller API - Hey, maybe this is the controller API!
  52. - It feels like a the controller API - It talks like the controller API - Hey, maybe this is the controller API!
  53. - Railtie: integra&amp;#xE7;&amp;#xE3;o com Rails, tais como: rakes, config, generators, middleware, log, initializers - ActiveModel::Lint::Tests
  54. - Railtie: integra&amp;#xE7;&amp;#xE3;o com Rails, tais como: rakes, config, generators, middleware, log, initializers - ActiveModel::Lint::Tests
  55. - Railtie: integra&amp;#xE7;&amp;#xE3;o com Rails, tais como: rakes, config, generators, middleware, log, initializers - ActiveModel::Lint::Tests
  56. - Railtie: integra&amp;#xE7;&amp;#xE3;o com Rails, tais como: rakes, config, generators, middleware, log, initializers - ActiveModel::Lint::Tests
  57. - Railtie: integra&amp;#xE7;&amp;#xE3;o com Rails, tais como: rakes, config, generators, middleware, log, initializers - ActiveModel::Lint::Tests
  58. - Falar oq &amp;#xE9; o mail_form: formul&amp;#xE1;rio de contato
  59. - Podemos pensar no ActiveRecord::Relation como um named_scope an&amp;#xF4;nimo
  60. - Query feita just-in-time
  61. - Query feita just-in-time
  62. - Query feita just-in-time
  63. - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  64. - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  65. - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  66. - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  67. - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  68. - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  69. - Muitas de nossas actions tem o c&amp;#xF3;digo de respond_to repetido v&amp;#xE1;rias vezes.
  70. - Responder &amp;#xE9; uma solu&amp;#xE7;&amp;#xE3;o do Rails para encapsular esse tipo de c&amp;#xF3;digo e seguir o DRY
  71. - Vamos ver como ele funciona. Temos as vari&amp;#xE1;veis do format, e do verbo http
  72. - Imagine agora a action create, no Rails 2.3
  73. Com o responders, ficaria assim. Conseguimos deletar muito c&amp;#xF3;digo!
  74. - o ActionController::Responder nada mais &amp;#xE9; do que a implementa&amp;#xE7;&amp;#xE3;o dessa tabela
  75. - Uma coisa interessante, &amp;#xE9; que podemos criar nossos pr&amp;#xF3;prios responders
  76. Oq &amp;#xE9; javascript n&amp;#xE3;o obtrusivo? Primeiro, vamos ver oq n&amp;#xE3;o &amp;#xE9;.
  77. Oq &amp;#xE9; javascript n&amp;#xE3;o obtrusivo? Primeiro, vamos ver oq n&amp;#xE3;o &amp;#xE9;.
  78. - Drivers para os principais frameworks - Se n&amp;#xE3;o tiver o que vc quer, vc sempre pode fazer o seu!
  79. - Pudemos ver ent&amp;#xE3;o qual a funda&amp;#xE7;&amp;#xE3;o para o agnosticismo de JS do Rails 3
  80. - Pudemos ver ent&amp;#xE3;o qual a funda&amp;#xE7;&amp;#xE3;o para o agnosticismo de JS do Rails 3
  81. - Pudemos ver ent&amp;#xE3;o qual a funda&amp;#xE7;&amp;#xE3;o para o agnosticismo de JS do Rails 3
  82. - &amp;#xC9; importante notar algumas dicas na hora de construir um helper que retorna HTML.
  83. - &amp;#xC9; importante notar algumas dicas na hora de construir um helper que retorna HTML.
  84. - &amp;#xC9; importante notar algumas dicas na hora de construir um helper que retorna HTML.
  85. - &amp;#xC9; importante notar algumas dicas na hora de construir um helper que retorna HTML.
  86. - &amp;#xC9; importante notar algumas dicas na hora de construir um helper que retorna HTML.
  87. - Nosso blog, twitter e contato - Estaremos o dia inteiro aqui no evento, nos procure para conversarmos
  88. - Nosso blog, twitter e contato - Estaremos o dia inteiro aqui no evento, nos procure para conversarmos
  89. - Nosso blog, twitter e contato - Estaremos o dia inteiro aqui no evento, nos procure para conversarmos