SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

KEY
Railties - Ruby Masters Conf - 26Feb2011
Plataformatec
 
PDF
railties @ ruby mastersconf - 2011.02.26
Carlos Antonio da Silva
 
PDF
Dando os primeiros passos com rails
Marcos Sousa
 
PDF
Usando Redis para otimizar o sistema boo-box
Fernando Mafra
 
PPT
Arview
startuppoint
 
XLS
Calific educ musical 2011
ESPOL
 
PPT
My shelf
startuppoint
 
PDF
7. ar go point27-_v2_ppt
startuppoint
 
Railties - Ruby Masters Conf - 26Feb2011
Plataformatec
 
railties @ ruby mastersconf - 2011.02.26
Carlos Antonio da Silva
 
Dando os primeiros passos com rails
Marcos Sousa
 
Usando Redis para otimizar o sistema boo-box
Fernando Mafra
 
Arview
startuppoint
 
Calific educ musical 2011
ESPOL
 
My shelf
startuppoint
 
7. ar go point27-_v2_ppt
startuppoint
 

Semelhante a Rails 3 - RS on Rails - 21aug2010 (20)

PDF
Introducao ao desenvolvimento web com Rails
Katon Agência Digital
 
PPTX
Curso de Ruby on Rails
CJR, UnB
 
PDF
Minicurso Ruby on Rails - Wake Up Systems
WakeUpSystems
 
KEY
Workshop Performance Rails
Vitor Pellegrino
 
PDF
Rails na prática
Marco Antonio Filho
 
PDF
TDC 2015 - Rails & Javascript: faça isso direito
Cezinha Anjos
 
PPT
Introdução Ruby 1.8.7 + Rails 3
Régis Eduardo Weizenmann Gregol
 
PDF
Ruby and Rails intro
Nuno Silva
 
PDF
Quick introduction to Ruby on Rails
Whitesmith
 
PDF
Começando com Git
Daniel Costa
 
PPTX
LambdaDay: Backbone.js
Giovanni Bassi
 
PPT
W2py pyconpe
Ovidio Marinho
 
PDF
Rails - EXATEC2009
Caue Guerra
 
ODP
Introdução ao Desenvolvimento WEB com Ruby on Rails
Julio Betta
 
PDF
[Rock'n Rails] Deploying Rails Applications with Capistrano
Almir Mendes
 
PPT
Tendências do Mercado de Internet
Vanessa Oliveira
 
PDF
Servidores web
Othon Oliveira
 
PDF
Ruby & Rails
Sergio Henrique
 
PPT
ruby on rails e o mercado
elliando dias
 
Introducao ao desenvolvimento web com Rails
Katon Agência Digital
 
Curso de Ruby on Rails
CJR, UnB
 
Minicurso Ruby on Rails - Wake Up Systems
WakeUpSystems
 
Workshop Performance Rails
Vitor Pellegrino
 
Rails na prática
Marco Antonio Filho
 
TDC 2015 - Rails & Javascript: faça isso direito
Cezinha Anjos
 
Introdução Ruby 1.8.7 + Rails 3
Régis Eduardo Weizenmann Gregol
 
Ruby and Rails intro
Nuno Silva
 
Quick introduction to Ruby on Rails
Whitesmith
 
Começando com Git
Daniel Costa
 
LambdaDay: Backbone.js
Giovanni Bassi
 
W2py pyconpe
Ovidio Marinho
 
Rails - EXATEC2009
Caue Guerra
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Julio Betta
 
[Rock'n Rails] Deploying Rails Applications with Capistrano
Almir Mendes
 
Tendências do Mercado de Internet
Vanessa Oliveira
 
Servidores web
Othon Oliveira
 
Ruby & Rails
Sergio Henrique
 
ruby on rails e o mercado
elliando dias
 
Anúncio

Mais de Plataformatec (15)

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

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 => "[email protected]" 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 => "[email protected]" 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 => "[email protected]" 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 => "[email protected]" 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 => "[email protected]" 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

Notas do Editor

  • #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: - 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
  • #5: Antes de tudo, quem sou eu?
  • #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: 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
  • #9: - 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
  • #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: * 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
  • #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: - 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
  • #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: * 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
  • #28: - 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
  • #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: - 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
  • #31: - 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
  • #32: - 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
  • #33: - 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
  • #34: - 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
  • #35: - 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
  • #37: - 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
  • #38: - 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
  • #39: - 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
  • #40: - 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.
  • #41: - 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;
  • #42: - 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;
  • #43: - 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;
  • #44: - 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;
  • #45: - 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;
  • #46: - 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
  • #47: - 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
  • #48: Que problema &amp;#xE9; esse do lock no $LOAD_PATH?
  • #49: Mas como que esse lock no $LOAD_PATH nos ajuda?
  • #50: Mas como que esse lock no $LOAD_PATH nos ajuda?
  • #51: Que problema &amp;#xE9; esse do lock no $LOAD_PATH?
  • #52: - Lembra dessa frase? O Bundler resolveu esse problema para voc&amp;#xEA;!
  • #53: Mas como que esse lock no $LOAD_PATH nos ajuda?
  • #54: Mas como que esse lock no $LOAD_PATH nos ajuda?
  • #86: - It feels like a the controller API - It talks like the controller API - Hey, maybe this is the controller API!
  • #87: - It feels like a the controller API - It talks like the controller API - Hey, maybe this is the controller API!
  • #88: - It feels like a the controller API - It talks like the controller API - Hey, maybe this is the controller API!
  • #89: - It feels like a the controller API - It talks like the controller API - Hey, maybe this is the controller API!
  • #101: - Railtie: integra&amp;#xE7;&amp;#xE3;o com Rails, tais como: rakes, config, generators, middleware, log, initializers - ActiveModel::Lint::Tests
  • #102: - Railtie: integra&amp;#xE7;&amp;#xE3;o com Rails, tais como: rakes, config, generators, middleware, log, initializers - ActiveModel::Lint::Tests
  • #103: - Railtie: integra&amp;#xE7;&amp;#xE3;o com Rails, tais como: rakes, config, generators, middleware, log, initializers - ActiveModel::Lint::Tests
  • #104: - Railtie: integra&amp;#xE7;&amp;#xE3;o com Rails, tais como: rakes, config, generators, middleware, log, initializers - ActiveModel::Lint::Tests
  • #105: - Railtie: integra&amp;#xE7;&amp;#xE3;o com Rails, tais como: rakes, config, generators, middleware, log, initializers - ActiveModel::Lint::Tests
  • #109: - Falar oq &amp;#xE9; o mail_form: formul&amp;#xE1;rio de contato
  • #115: - Podemos pensar no ActiveRecord::Relation como um named_scope an&amp;#xF4;nimo
  • #116: - Query feita just-in-time
  • #117: - Query feita just-in-time
  • #118: - Query feita just-in-time
  • #119: - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  • #120: - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  • #121: - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  • #122: - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  • #123: - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  • #124: - Os novos finders s&amp;#xE3;o encade&amp;#xE1;veis
  • #129: - Muitas de nossas actions tem o c&amp;#xF3;digo de respond_to repetido v&amp;#xE1;rias vezes.
  • #130: - 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
  • #131: - Vamos ver como ele funciona. Temos as vari&amp;#xE1;veis do format, e do verbo http
  • #132: - Imagine agora a action create, no Rails 2.3
  • #133: Com o responders, ficaria assim. Conseguimos deletar muito c&amp;#xF3;digo!
  • #134: - o ActionController::Responder nada mais &amp;#xE9; do que a implementa&amp;#xE7;&amp;#xE3;o dessa tabela
  • #135: - Uma coisa interessante, &amp;#xE9; que podemos criar nossos pr&amp;#xF3;prios responders
  • #142: Oq &amp;#xE9; javascript n&amp;#xE3;o obtrusivo? Primeiro, vamos ver oq n&amp;#xE3;o &amp;#xE9;.
  • #143: Oq &amp;#xE9; javascript n&amp;#xE3;o obtrusivo? Primeiro, vamos ver oq n&amp;#xE3;o &amp;#xE9;.
  • #146: - Drivers para os principais frameworks - Se n&amp;#xE3;o tiver o que vc quer, vc sempre pode fazer o seu!
  • #147: - Pudemos ver ent&amp;#xE3;o qual a funda&amp;#xE7;&amp;#xE3;o para o agnosticismo de JS do Rails 3
  • #148: - Pudemos ver ent&amp;#xE3;o qual a funda&amp;#xE7;&amp;#xE3;o para o agnosticismo de JS do Rails 3
  • #149: - Pudemos ver ent&amp;#xE3;o qual a funda&amp;#xE7;&amp;#xE3;o para o agnosticismo de JS do Rails 3
  • #156: - &amp;#xC9; importante notar algumas dicas na hora de construir um helper que retorna HTML.
  • #157: - &amp;#xC9; importante notar algumas dicas na hora de construir um helper que retorna HTML.
  • #158: - &amp;#xC9; importante notar algumas dicas na hora de construir um helper que retorna HTML.
  • #159: - &amp;#xC9; importante notar algumas dicas na hora de construir um helper que retorna HTML.
  • #160: - &amp;#xC9; importante notar algumas dicas na hora de construir um helper que retorna HTML.
  • #168: - Nosso blog, twitter e contato - Estaremos o dia inteiro aqui no evento, nos procure para conversarmos
  • #169: - Nosso blog, twitter e contato - Estaremos o dia inteiro aqui no evento, nos procure para conversarmos
  • #170: - Nosso blog, twitter e contato - Estaremos o dia inteiro aqui no evento, nos procure para conversarmos