Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

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

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

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

Slide 120

Slide 120 text

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

Slide 121

Slide 121 text

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

Slide 122

Slide 122 text

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

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

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

Slide 130

Slide 130 text

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

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

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

Slide 134

Slide 134 text

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

Slide 135

Slide 135 text

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

Slide 136

Slide 136 text

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

Slide 137

Slide 137 text

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

Slide 138

Slide 138 text

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

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

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

Slide 141

Slide 141 text

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

Slide 142

Slide 142 text

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

Slide 143

Slide 143 text

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

Slide 144

Slide 144 text

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

Slide 145

Slide 145 text

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

Slide 146

Slide 146 text

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

Slide 147

Slide 147 text

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

Slide 148

Slide 148 text

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

Slide 149

Slide 149 text

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 Destroy Sunday, November 6, 11

Slide 150

Slide 150 text

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

Slide 151

Slide 151 text

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

Slide 152

Slide 152 text

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

Slide 153

Slide 153 text

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

Slide 154

Slide 154 text

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

Slide 155

Slide 155 text

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

Slide 156

Slide 156 text

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

Slide 157

Slide 157 text

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

Slide 158

Slide 158 text

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

Slide 159

Slide 159 text

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

Slide 160

Slide 160 text

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

Slide 161

Slide 161 text

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

Slide 162

Slide 162 text

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

Slide 163

Slide 163 text

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

Slide 164

Slide 164 text

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

Slide 165

Slide 165 text

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

Slide 166

Slide 166 text

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

Slide 167

Slide 167 text

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

Slide 168

Slide 168 text

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

Slide 169

Slide 169 text

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

Slide 170

Slide 170 text

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

Slide 171

Slide 171 text

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

Slide 172

Slide 172 text

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

Slide 173

Slide 173 text

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

Slide 174

Slide 174 text

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

Slide 175

Slide 175 text

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