Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rails 3 @ RS on Rails 2010

Rails 3 @ RS on Rails 2010

Carlos Antonio

August 21, 2010
Tweet

More Decks by Carlos Antonio

Other Decks in Programming

Transcript

  1. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rails 3
    Sunday, November 6, 11

    View Slide

  2. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    blog twitter
    ID
    Rails 3
    Sunday, November 6, 11

    View Slide

  3. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Quem sou eu?
    • Carlos Antonio da Silva
    • Desenvolvedor Ruby e Rails há mais de 2 anos
    • Engenheiro da Plataforma Tecnologia a 1 ano
    Sunday, November 6, 11

    View Slide

  4. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Sunday, November 6, 11

    View Slide

  5. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Desenvolvimento de
    aplicações em Rails
    Consultoria
    Coaching em
    Rails e Agile
    Sunday, November 6, 11

    View Slide

  6. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rails 3
    Sunday, November 6, 11

    View Slide

  7. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Como tudo começou?
    Sunday, November 6, 11

    View Slide

  8. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Como tudo começou?
    Sunday, November 6, 11

    View Slide

  9. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Como tudo começou?
    Sunday, November 6, 11

    View Slide

  10. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Como tudo começou?
    Sunday, November 6, 11

    View Slide

  11. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Como tudo começou?
    Sunday, November 6, 11

    View Slide

  12. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Como tudo começou?
    Sunday, November 6, 11

    View Slide

  13. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Vantagens do Rails 3
    Sunday, November 6, 11

    View Slide

  14. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Vantagens do Rails 3
    Performance
    Sunday, November 6, 11

    View Slide

  15. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Vantagens do Rails 3
    Performance
    Modularidade
    Sunday, November 6, 11

    View Slide

  16. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Vantagens do Rails 3
    Performance
    Modularidade
    Agnosticismo
    Sunday, November 6, 11

    View Slide

  17. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Arquitetura
    ActionDispatch
    ActiveSupport
    Rails
    Sunday, November 6, 11

    View Slide

  18. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Arquitetura
    ActionDispatch
    ActiveSupport
    Rails
    Todo o resto são
    Railties!
    Sunday, November 6, 11

    View Slide

  19. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Arquitetura
    ActionDispatch
    ActiveSupport
    Rails
    Todo o resto são
    Railties!
    ActiveRecord
    ActionMailer
    ActionController
    ActionView
    outros...
    Sunday, November 6, 11

    View Slide

  20. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Como o Rails 3
    muda o modo como
    desenvolvemos?
    Sunday, November 6, 11

    View Slide

  21. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    rails command
    Rails 2.3 Rails 3
    rails blog rails new blog
    Sunday, November 6, 11

    View Slide

  22. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    rails command
    ruby script/server
    ruby script/console
    ruby script/generate
    ruby script/dbconsole
    rails console
    rails generate
    rails dbconsole
    rails server
    Rails 2.3 Rails 3
    Sunday, November 6, 11

    View Slide

  23. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    rails command
    rails server
    rails console
    rails generate
    rails dbconsole
    rails c
    rails g
    rails db
    rails s
    Rails 3 Shortcuts!
    Sunday, November 6, 11

    View Slide

  24. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    blog/config.ru
    require ::File.expand_path('../config/environment', __FILE__)
    run Blog::Application
    Sunday, November 6, 11

    View Slide

  25. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    blog/config.ru
    require ::File.expand_path('../config/environment', __FILE__)
    run Blog::Application
    Sunday, November 6, 11

    View Slide

  26. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  27. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    uma Rack App!
    Sunday, November 6, 11

    View Slide

  28. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    O que é uma Rack App?
    Sunday, November 6, 11

    View Slide

  29. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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!"] ] }
    Sunday, November 6, 11

    View Slide

  30. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    uma Rack App!
    Sunday, November 6, 11

    View Slide

  31. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  32. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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)
    Sunday, November 6, 11

    View Slide

  33. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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)
    Sunday, November 6, 11

    View Slide

  34. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler
    Router
    ActionMailer
    ActiveModel
    ActiveRecord
    Responders
    Unobtrusive Javascript
    XSS Protection
    Sunday, November 6, 11

    View Slide

  35. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Sunday, November 6, 11

    View Slide

  36. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Biblioteca para gerenciamento de
    dependências
    Sunday, November 6, 11

    View Slide

  37. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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)
    Rubygems
    Resolução de dependências
    Sunday, November 6, 11

    View Slide

  38. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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)
    Rubygems
    Resolução de dependências
    Sunday, November 6, 11

    View Slide

  39. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rubygems
    Resolução de dependências
    require "rubygems"
    require "thin"
    gem "actionpack", "2.3.5"
    Gems instaladas do rack:
    * rack (1.0.1)
    * rack (1.1.0)
    Sunday, November 6, 11

    View Slide

  40. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rubygems
    Resolução de dependências
    require "rubygems"
    require "thin"
    gem "actionpack", "2.3.5"
    BOOM!!!
    Gems instaladas do rack:
    * rack (1.0.1)
    * rack (1.1.0)
    Sunday, November 6, 11

    View Slide

  41. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rubygems
    Resolução de dependências
    require "rubygems"
    require "thin"
    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)
    Gems instaladas do rack:
    * rack (1.0.1)
    * rack (1.1.0)
    Sunday, November 6, 11

    View Slide

  42. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rubygems
    Resolução de dependências
    require "rubygems"
    require "thin"
    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)
    Gems instaladas do rack:
    * rack (1.0.1)
    * rack (1.1.0)
    Sunday, November 6, 11

    View Slide

  43. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rubygems
    Resolução de dependências
    require "rubygems"
    require "thin"
    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)
    Gems instaladas do rack:
    * rack (1.0.1)
    * rack (1.1.0)
    Sunday, November 6, 11

    View Slide

  44. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler: Gemfile
    # Gemfile
    gem "thin"
    gem "actionpack", "2.3.5"
    Sunday, November 6, 11

    View Slide

  45. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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)
    Sunday, November 6, 11

    View Slide

  46. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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)
    Sunday, November 6, 11

    View Slide

  47. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rubygems
    $LOAD_PATH
    Sunday, November 6, 11

    View Slide

  48. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    rsrails$ gem list
    *** LOCAL GEMS ***
    bundler (0.9.25)
    rake (0.8.7, 0.8.5)
    rdoc (2.5.8)
    thor (0.13.6)
    } Filesystem
    Sunday, November 6, 11

    View Slide

  49. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    rsrails$ gem list
    *** LOCAL GEMS ***
    bundler (0.9.25)
    rake (0.8.7, 0.8.5)
    rdoc (2.5.8)
    thor (0.13.6)
    } Filesystem
    # Rubygems
    gem “rake”, “0.8.5”
    } Gemfile
    Sunday, November 6, 11

    View Slide

  50. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    rsrails$ gem list
    *** LOCAL GEMS ***
    bundler (0.9.25)
    rake (0.8.7, 0.8.5)
    rdoc (2.5.8)
    thor (0.13.6)
    } Filesystem
    # Rubygems
    gem “rake”, “0.8.5”
    } Gemfile
    bundler (0.9.25)
    rake (0.8.7, 0.8.5)
    rdoc (2.5.8)
    thor (0.13.6)
    } $LOAD_PATH
    Sunday, November 6, 11

    View Slide

  51. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler
    Lock no $LOAD_PATH
    Sunday, November 6, 11

    View Slide

  52. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Esqueci de colocar no config.gem!
    Sunday, November 6, 11

    View Slide

  53. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Esqueci de colocar no config.gem!
    Sunday, November 6, 11

    View Slide

  54. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    rsrails$ gem list
    *** LOCAL GEMS ***
    bundler (0.9.25)
    rake (0.8.7, 0.8.5)
    rdoc (2.5.8)
    thor (0.13.6)
    } Filesystem
    Sunday, November 6, 11

    View Slide

  55. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    rsrails$ gem list
    *** LOCAL GEMS ***
    bundler (0.9.25)
    rake (0.8.7, 0.8.5)
    rdoc (2.5.8)
    thor (0.13.6)
    } Filesystem
    # Gemfile - Bundler
    gem “rake”, “0.8.5”
    } Gemfile
    Sunday, November 6, 11

    View Slide

  56. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    rsrails$ gem list
    *** LOCAL GEMS ***
    bundler (0.9.25)
    rake (0.8.7, 0.8.5)
    rdoc (2.5.8)
    thor (0.13.6)
    } Filesystem
    # Gemfile - Bundler
    gem “rake”, “0.8.5”
    } Gemfile
    rake-0.8.5
    } $LOAD_PATH
    Sunday, November 6, 11

    View Slide

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

    View Slide

  58. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    # Gemfile
    gem "rake"
    rsrails$ gem list
    rake (0.8.7, 0.8.5)
    thor (0.13.6)
    Sunday, November 6, 11

    View Slide

  59. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    # Gemfile
    gem "rake"
    # test_load_path_lock.rb
    require "rubygems"
    require "bundler"
    Bundler.setup
    require "rake"
    require "thor"
    rsrails$ gem list
    rake (0.8.7, 0.8.5)
    thor (0.13.6)
    Sunday, November 6, 11

    View Slide

  60. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    # Gemfile
    gem "rake"
    # test_load_path_lock.rb
    require "rubygems"
    require "bundler"
    Bundler.setup
    require "rake"
    require "thor"
    rsrails$ gem list
    rake (0.8.7, 0.8.5)
    thor (0.13.6)
    Lock no $LOAD_PATH
    Sunday, November 6, 11

    View Slide

  61. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    # Gemfile
    gem "rake"
    # test_load_path_lock.rb
    require "rubygems"
    require "bundler"
    Bundler.setup
    require "rake"
    require "thor"
    rsrails$ gem list
    rake (0.8.7, 0.8.5)
    thor (0.13.6)
    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
    Lock no $LOAD_PATH
    Sunday, November 6, 11

    View Slide

  62. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    # Gemfile
    gem "rake"
    # test_load_path_lock.rb
    require "rubygems"
    require "bundler"
    Bundler.setup
    require "rake"
    require "thor"
    rsrails$ gem list
    rake (0.8.7, 0.8.5)
    thor (0.13.6)
    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
    Lock no $LOAD_PATH
    Sunday, November 6, 11

    View Slide

  63. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Packaging System
    OMG!
    Sunday, November 6, 11

    View Slide

  64. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler
    Router
    ActionMailer
    ActiveModel
    ActiveRecord
    Responders
    Unobtrusive Javascript
    XSS Protection
    Sunday, November 6, 11

    View Slide

  65. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Nova API
    Router
    Sunday, November 6, 11

    View Slide

  66. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rotas root
    Rails 2.3
    Rails 3
    map.root :controller => "welcome"
    root :to => "welcome#index"
    Sunday, November 6, 11

    View Slide

  67. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rotas comuns
    Rails 2.3
    Rails 3
    map.connect "products/:id", :controller=> "catalog", :action => "view"
    match 'products/:id' => 'catalog#view'
    Sunday, November 6, 11

    View Slide

  68. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rotas nomeadas
    Rails 2.3
    Rails 3
    map.purchase "products/:id/purchase", :controller => "catalog",
    :action => "purchase"
    match "products/:id/purchase" => 'catalog#purchase',
    :as => :purchase
    Sunday, November 6, 11

    View Slide

  69. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Resources com member e
    collection
    Rails 2.3
    Rails 3
    map.resources :products, :member => { :short => :get,
    :toggle => :post }, :collection => { :sold => :get }
    resources :products do
    member do
    get :short
    post :toggle
    end
    get :sold, :on => :collection
    end
    Sunday, November 6, 11

    View Slide

  70. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Router e Rack FTW!
    Sunday, November 6, 11

    View Slide

  71. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Router e Rack FTW!
    Sunday, November 6, 11

    View Slide

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

    View Slide

  73. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Router e Rack FTW!
    match "posts/:echo", :to => "posts#show"
    match "posts/:echo", :to => PostsController.action(:show)
    Rack App!
    Sunday, November 6, 11

    View Slide

  74. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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!
    Sunday, November 6, 11

    View Slide

  75. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Router e Rack FTW!
    match "posts/:echo", :to => "posts#show"
    match "posts/:echo", :to => PostsController.action(:show)
    match "posts/:echo" => lambda { |env| [ 200, {“Content-Type” =>
    “plain/text”}, ["Echo!"] ] }
    match "/posts/:echo" => redirect("/foo/%{echo}")
    Rack App!
    Sunday, November 6, 11

    View Slide

  76. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Router e Rack FTW!
    match "posts/:echo", :to => "posts#show"
    match "posts/:echo", :to => PostsController.action(:show)
    match "posts/:echo" => MySinatraBlog
    match "posts/:echo" => lambda { |env| [ 200, {“Content-Type” =>
    “plain/text”}, ["Echo!"] ] }
    match "/posts/:echo" => redirect("/foo/%{echo}")
    Rack App!
    Sunday, November 6, 11

    View Slide

  77. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    100% compatível
    com Rack
    OMG!
    Sunday, November 6, 11

    View Slide

  78. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler
    Router
    ActionMailer
    ActiveModel
    ActiveRecord
    Responders
    Unobtrusive Javascript
    XSS Protection
    Sunday, November 6, 11

    View Slide

  79. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  80. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    mailers com diretório próprio
    Sunday, November 6, 11

    View Slide

  81. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    ActionMailer
    Nova API
    Sunday, November 6, 11

    View Slide

  82. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    TMail
    Sunday, November 6, 11

    View Slide

  83. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    TMail
    Mail
    Sunday, November 6, 11

    View Slide

  84. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    ActionMailer nova API
    Sunday, November 6, 11

    View Slide

  85. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    ActionMailer nova API
    Defaults
    Sunday, November 6, 11

    View Slide

  86. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Variáveis
    de
    instância
    ActionMailer nova API
    Defaults
    Sunday, November 6, 11

    View Slide

  87. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Variáveis
    de
    instância Attachments tipo
    cookies
    ActionMailer nova API
    Defaults
    Sunday, November 6, 11

    View Slide

  88. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Variáveis
    de
    instância Attachments tipo
    cookies
    mail tipo respond_to do |format|
    ActionMailer nova API
    Defaults
    Sunday, November 6, 11

    View Slide

  89. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    ActionMailer::Base ActionController::Base
    ActionController::Metal
    AbstractController::Base
    Sunday, November 6, 11

    View Slide

  90. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Menos coisas para
    lembrar
    OMG!
    Sunday, November 6, 11

    View Slide

  91. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler
    Router
    ActionMailer
    ActiveModel
    ActiveRecord
    Responders
    Unobtrusive Javascript
    XSS Protection
    Sunday, November 6, 11

    View Slide

  92. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    ActiveModel
    Sunday, November 6, 11

    View Slide

  93. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    • Google Summer of Code 2009:
    ActiveModel
    Sunday, November 6, 11

    View Slide

  94. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    • Google Summer of Code 2009:
    • Extrair a lógica comum entre ActiveRecord e
    ActiveResource
    ActiveModel
    Sunday, November 6, 11

    View Slide

  95. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    • Google Summer of Code 2009:
    • Extrair a lógica comum entre ActiveRecord e
    ActiveResource
    • Hoje
    ActiveModel
    Sunday, November 6, 11

    View Slide

  96. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    • Google Summer of Code 2009:
    • Extrair a lógica comum entre ActiveRecord e
    ActiveResource
    • Hoje
    • Desempenha papel no agnosticismo de ORM
    ActiveModel
    Sunday, November 6, 11

    View Slide

  97. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    • 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
    ActiveModel
    Sunday, November 6, 11

    View Slide

  98. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  99. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  100. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    MyApp + ActiveModel
    class Person
    include ActiveModel::Validations
    attr_accessor :name, :age
    validates_presence_of :name, :age
    end
    >> p = Person.new
    => #
    >> p.valid?
    => false
    >> p.errors.full_messages
    => ["Name can't be blank", "Age can't be blank"]
    Sunday, November 6, 11

    View Slide

  101. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Agnosticismo de ORM
    Sunday, November 6, 11

    View Slide

  102. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    ActiveModel Rails::Railtie
    Agnosticismo de ORM
    Agnosticismo de ORM
    Sunday, November 6, 11

    View Slide

  103. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    ActiveModel Rails::Railtie
    Agnosticismo de ORM
    Agnosticismo de ORM
    Provê uma API para que o
    ActionPack possa conversar com o
    ORM
    Sunday, November 6, 11

    View Slide

  104. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    ActiveModel Rails::Railtie
    Agnosticismo de ORM
    Agnosticismo de ORM
    Integração do ORM com o Rails
    Provê uma API para que o
    ActionPack possa conversar com o
    ORM
    Sunday, November 6, 11

    View Slide

  105. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Callbacks
    Serialization
    Validations
    Data Mapper MongoDB
    ActiveRecord MeuModel
    ActiveModel
    Sunday, November 6, 11

    View Slide

  106. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    ActiveModel::Lint::Tests
    Sunday, November 6, 11

    View Slide

  107. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  108. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    ActiveRecord-like
    http://github.com/plataformatec/mail_form
    Ótimo exemplo de uso do ActiveModel
    Sunday, November 6, 11

    View Slide

  109. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Menos hacks!
    Reusabilidade
    OMG!
    Sunday, November 6, 11

    View Slide

  110. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler
    Router
    ActionMailer
    ActiveModel
    ActiveRecord
    Responders
    Unobtrusive Javascript
    XSS Protection
    Sunday, November 6, 11

    View Slide

  111. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Nova API
    select
    where
    order
    limit
    offset
    from
    joins
    includes
    group
    having
    lock
    readonly
    Sunday, November 6, 11

    View Slide

  112. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Nova API
    Post.find(:all, :order => "published_at desc", :limit => 10)
    Rails 2.3
    Rails 3
    Post.order("published_at desc").limit(10)
    Sunday, November 6, 11

    View Slide

  113. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Nova API
    Rails 2.3
    Rails 3
    Post.all(:conditions => ["published_at <= ?", Time.now],
    :include => :comments)
    Post.where("published_at <= ?", Time.now).includes(:comments)
    Sunday, November 6, 11

    View Slide

  114. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Lazy loading
    Job.find(:all, :conditions => {:published => true})
    Job.where(:published => true)
    Faz um query no DB imediatamente e retorna um array de Jobs
    Não faz query no DB, retorna um ActiveRecord::Relation
    Rails 2.3
    Rails 3
    Sunday, November 6, 11

    View Slide

  115. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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 %>
    Sunday, November 6, 11

    View Slide

  116. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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 %>
    Não realiza query no DB
    Sunday, November 6, 11

    View Slide

  117. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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 %>
    Só aqui que será feito a query no DB
    Não realiza query no DB
    Sunday, November 6, 11

    View Slide

  118. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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 %>
    Só aqui que será feito a query no DB
    Não realiza query no DB
    Se estiver cacheado, a query
    não é disparada!
    Sunday, November 6, 11

    View Slide

  119. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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)
    Sunday, November 6, 11

    View Slide

  120. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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)
    ActiveRecord::Relation
    Sunday, November 6, 11

    View Slide

  121. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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)
    ActiveRecord::Relation
    Reaproveitar uma Relation
    e encadear mais finders
    Sunday, November 6, 11

    View Slide

  122. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  123. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  124. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  125. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  126. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    DRY
    Sunday, November 6, 11

    View Slide

  127. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Mas e sobre o ARel
    que tanto se fala?
    Sunday, November 6, 11

    View Slide

  128. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    ARel == Relational Algebra
    ARel != ActiveRecord::Relation
    Sunday, November 6, 11

    View Slide

  129. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Código mais limpo
    OMG!
    Sunday, November 6, 11

    View Slide

  130. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler
    Router
    ActionMailer
    ActiveModel
    ActiveRecord
    Responders
    Unobtrusive Javascript
    XSS Protection
    Sunday, November 6, 11

    View Slide

  131. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    def index
    @users = User.all
    respond_to do |format|
    format.html # index.html.erb
    format.xml { render :xml => @users }
    end
    end
    Rails 2.3
    Sunday, November 6, 11

    View Slide

  132. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    def index
    @users = User.all
    respond_to do |format|
    format.html # index.html.erb
    format.xml { render :xml => @users }
    end
    end
    Rails 2.3
    Sunday, November 6, 11

    View Slide

  133. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rails 3.0
    respond_to :html, :xml
    def index
    @users = User.all
    respond_with(@users)
    end
    Sunday, November 6, 11

    View Slide

  134. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rails 3.0
    respond_to :html, :xml
    def index
    @users = User.all
    respond_with(@users)
    end
    Sunday, November 6, 11

    View Slide

  135. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    3 variáveis
    Formato do request
    Verbo HTTP
    Status do recurso
    Sunday, November 6, 11

    View Slide

  136. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Rails 2.3
    Sunday, November 6, 11

    View Slide

  137. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Rails 3.0
    def create
    @user = User.new(params[:user])
    flash[:notice] = 'User was successfully created' if @user.save
    respond_with(@user)
    end
    Sunday, November 6, 11

    View Slide

  138. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    respond_with(@users)
    ActionController::Responder
    Formato do request
    Verbo HTTP
    Status do recurso
    Sunday, November 6, 11

    View Slide

  139. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    respond_with(@users)
    ActionController::Responder
    to_code
    Formato do request
    Verbo HTTP
    Status do recurso
    Sunday, November 6, 11

    View Slide

  140. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Responders Customizados
    Sunday, November 6, 11

    View Slide

  141. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    github.com/plataformatec/responders
    Sunday, November 6, 11

    View Slide

  142. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    github.com/plataformatec/responders
    FlashResponder: seta o flash baseado no controller,
    na action e no status do recurso
    Sunday, November 6, 11

    View Slide

  143. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  144. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  145. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    DRY
    OMG!
    Sunday, November 6, 11

    View Slide

  146. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler
    Router
    ActionMailer
    ActiveModel
    ActiveRecord
    Responders
    Unobtrusive Javascript
    XSS Protection
    Sunday, November 6, 11

    View Slide

  147. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    remote_form_for(@post)
    Unobtrusive Javascript: Rails 2.3
    link_to 'Destroy', post, :confirm => 'Are you sure?',:method => :delete
    Sunday, November 6, 11

    View Slide

  148. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    remote_form_for(@post)
    Unobtrusive Javascript: Rails 2.3
    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
    Sunday, November 6, 11

    View Slide

  149. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    remote_form_for(@post)
    Unobtrusive Javascript: Rails 2.3
    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
    Destroy
    Sunday, November 6, 11

    View Slide

  150. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Unobtrusive Javascript: Rails 3
    form_for(@posts, :remote => true)
    method="post">
    Sunday, November 6, 11

    View Slide

  151. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Unobtrusive Javascript: Rails 3
    form_for(@posts, :remote => true)
    method="post">
    Sunday, November 6, 11

    View Slide

  152. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Unobtrusive Javascript: Rails 3
    link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete
    rel="nofollow">Destroy
    Sunday, November 6, 11

    View Slide

  153. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Unobtrusive Javascript: Rails 3
    link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete
    rel="nofollow">Destroy
    Sunday, November 6, 11

    View Slide

  154. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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!
    Sunday, November 6, 11

    View Slide

  155. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Javascript no Rails 3
    Sunday, November 6, 11

    View Slide

  156. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    HTML 5 custom data attributes JS driver para cada framework
    Agnosticismo de Javascript
    Javascript no Rails 3
    Sunday, November 6, 11

    View Slide

  157. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    • link_to_remote
    • observe_field
    • form_remote_tag
    • submit_to_remote
    • periodically_call_remote
    • remote_form_for
    • observe_form
    • button_to_remote
    Helpers Deprecados no Rails 3
    http://github.com/rails/prototype_legacy_helper
    Sunday, November 6, 11

    View Slide

  158. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Agnosticismo +
    HTML 5
    OMG! JQUERY!
    Sunday, November 6, 11

    View Slide

  159. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler
    Router
    ActionMailer
    ActiveModel
    ActiveRecord
    Responders
    Unobtrusive Javascript
    XSS Protection
    Sunday, November 6, 11

    View Slide

  160. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    XSS protection
    <%= @job.title %> <%= h @job.title %>
    Rails 2.3: unsafe por default
    safe
    unsafe
    <%= @job.title %> <%= raw @job.title %>
    Rails 3: safe por default
    safe unsafe
    Sunday, November 6, 11

    View Slide

  161. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    XSS protection
    <%= @job.title %> <%= h @job.title %>
    Rails 2.3: unsafe por default
    safe
    unsafe
    <%= @job.title %> <%= raw @job.title %>
    Rails 3: safe por default
    safe unsafe
    Sunday, November 6, 11

    View Slide

  162. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    XSS protection
    <%= @job.title %> <%= h @job.title %>
    Rails 2.3: unsafe por default
    safe
    unsafe
    <%= @job.title %> <%= raw @job.title %>
    Rails 3: safe por default
    safe unsafe
    Sunday, November 6, 11

    View Slide

  163. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Helpers que retornam HTML
    module ApplicationHelper
    def strong(content)
    "#{h content}".html_safe
    end
    end
    Sunday, November 6, 11

    View Slide

  164. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Helpers que retornam HTML
    module ApplicationHelper
    def strong(content)
    "#{h content}".html_safe
    end
    end
    Dicas:
    1. Certificar-se de que todo input está sendo escapado
    Sunday, November 6, 11

    View Slide

  165. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Helpers que retornam HTML
    module ApplicationHelper
    def strong(content)
    "#{h content}".html_safe
    end
    end
    Dicas:
    1. Certificar-se de que todo input está sendo escapado
    2. Chamar html_safe no output
    Sunday, November 6, 11

    View Slide

  166. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Segurança
    OMG!
    Sunday, November 6, 11

    View Slide

  167. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Bundler
    Router
    ActionMailer
    ActiveModel
    ActiveRecord
    Responders
    Unobtrusive Javascript
    XSS Protection
    Sunday, November 6, 11

    View Slide

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

    View Slide

  169. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  170. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Para atualizar
    Sunday, November 6, 11

    View Slide

  171. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Para atualizar
    • rails upgrade plugin:
    • http://github.com/rails/rails_upgrade
    Sunday, November 6, 11

    View Slide

  172. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    Para atualizar
    • rails upgrade plugin:
    • http://github.com/rails/rails_upgrade
    • rails upgrade handbook:
    • http://www.railsupgradehandbook.com/
    Sunday, November 6, 11

    View Slide

  173. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    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
    Sunday, November 6, 11

    View Slide

  174. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    http://github.com/plataformatec
    Tem muito mais aqui!
    ?!
    Sunday, November 6, 11

    View Slide

  175. Carlos Antonio @cantoniodasilva
    blog.plataformatec.com.br
    blog twitter
    ID
    http://github.com/plataformatec
    Tem muito mais aqui!
    ?!
    Sunday, November 6, 11

    View Slide