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

Rails 4.0 Whirlwind Tour

Rails 4.0 Whirlwind Tour

Avatar for Andy Lindeman

Andy Lindeman

October 10, 2012
Tweet

More Decks by Andy Lindeman

Other Decks in Programming

Transcript

  1. How to Install Rails 4? $ hub clone rails/rails $

    rails/railties/bin/rails new <path> --edge create create README.rdoc create Rakefile create config.ru create .gitignore create Gemfile ...
  2. Most Important Change # Rails 3 > "police".singularize => "polouse"

    # Rails 4 > "police".singularize => "police"
  3. Rails.queue # config/environments/production.rb # Jobs run in a background thread

    config.queue = ActiveSupport::Queue # Jobs run via Resque config.queue = ??? # Jobs run via delayed_job config.queue = ??? # Jobs run via Sidekiq (rails4 branch) config.queue = Sidekiq::Client::Queue
  4. Async ActionMailer # All mailers async config.action_mailer.async = true #

    Specific mailer async class MyMailer < ActionMailer::Base self.async = true end
  5. ActiveModel:: MassAssignmentSecurity (Rails 3) class Post < ActiveRecord::Base attr_accessible :title,

    :body end class PostsController <ApplicationController def create @post = Post.create(params[:post]) end end
  6. strong_parameters (Rails 4) class Post < ActiveRecord::Base end class PostsController

    <ApplicationController def create @post = Post.create(post_params) end private def post_params params.require(:post). permit(:title, :body) end end
  7. strong_parameters • Passing params directly into a mass-assigned model method

    from a controller raises ActiveModel::ForbiddenAttributesError • Mass-assigned model methods used elsewhere in the app accept all params • attr_accessible & attr_protected removed and extracted to the protected_attributes gem
  8. Caching: The Problem # app/views/projects/show.html.erb <% cache [ "v1", project

    ] do %> <h1>All documents</h1> <%= render project.documents %> <% end %> # app/views/documents/_document.html.erb <% cache [ "v1", document ] do %> My document: <%= document.name %> <% end %>
  9. cache_digest's solution # app/views/projects/show.html.erb <% cache project do %> <h1>All

    documents</h1> <%= render project.documents %> <% end %> # app/views/documents/_document.html.erb <% cache document do %> My document: <%= document.name %> <% end %>
  10. Caching Deprecations • Action caching removed and extracted to actionpack-action_caching

    gem • Page caching removed and extracted to actionpack-page_caching gem
  11. ActionController::Live class MyController < ApplicationController include ActionController::Live def index 100.times

    { response.stream.write "hello\n" # sleep 1 } response.stream.close end end Example from http://tenderlovemaking.com/2012/07/30/is-it-live.html
  12. ActionController::Live • Needs correctly configured web-server ◦ thin/rainbows/puma over unicorn

    • Resources ◦ Tenderlove Making: Is it live? ◦ Rails Guides: ActionController
  13. PATCH Verb class PostsController <ApplicationController # PATCH/PUT /posts/1 # PATCH/PUT

    /posts/1.json def update @post = Post.find(params[:id]) # ... end end • form_for @persisted_object uses PATCH • API requests can use PUT or PATCH
  14. Relation#all returns a relation (chainable) # Rails 3 > Post.all.class

    Array # Rails 4 > Post.all.class ActiveRecord::Relation > Post.all.to_a.class Array
  15. nil is no longer whiny # Rails 3 > nil.id

    RuntimeError: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id # Rails 4 > nil.id NoMethodError: undefined method `id' for nil:NilClass
  16. /updates?_(attribute|column)s?/ Validations run? Callbacks run? updated_at touched? Dirty attributes updated?

    update_attributes( :name => "value") YES YES YES YES update_attribute( :name, "value") NO YES YES YES update_columns( :name => "value") NO NO NO NO update_column( :name, "value") NO NO NO NO
  17. Relation#none # Chainable null object > Post.none #<ActiveRecord::Relation []> #

    Doesn't hit database > Post.none.to_sql "" > Post.none.to_a []
  18. #first and #last no longer have ordering gotcha # Rails

    3 > Post.first SELECT "posts".* FROM "posts" LIMIT 1 # Rails 4 > Post.first SELECT "posts".* FROM "posts" ORDER BY "posts"."id" ASC LIMIT 1
  19. Plugins are dead; long live plugins • Gems are A-OK!

    We're talking old school plugins • vendor/plugins is no longer a thing • Move plugins to lib/ and require manually in config/initializers • Or create a gemified version and manage via Bundler
  20. Rails 2 Finder Syntax: Gone! • User.find(:all, ...) • User.find(:first,

    ...) • User.find(:last, ...) • Use ARel chained syntax
  21. includes as an OUTER JOIN w/ conditions # Rails 3

    > Post.includes(:comments). where("comments.created_at > ?", ...) SELECT ... from posts LEFT OUTER JOIN ... WHERE ... # Rails 4 > Post.includes(:comments). where("comments.created_at > ?", ...) DEPRECATION WARNING
  22. includes as an OUTER JOIN w/ conditions # Rails 4

    > Post.includes(:comments). where("comments.created_at > ?", ...). references(:comments) > Post.includes(:comments). where(:comments => { :title => "..." }) > Post.includes(:comments). order("comments.created_at")
  23. Dynamic Finders find_by_... find_by_...! OK find_all_by_... scoped_by_... where(...) find_last_by_... where(...).last

    find_or_initialize_by_... where(...). first_or_initialize find_or_create_by_... where(...). first_or_create find_or_create_by_...! where(...). first_or_create!
  24. Eager-evaluated scopes # Deprecated scope :published, where(:published => true) #

    Pitfall scope :recent, where("created_at > ?", 1.week.ago) # Use a lambda (always, not just for time!) scope :published, -> { where(:published => true) }
  25. AJAX Forms & authenticity_token • form_for :remote => true •

    rails.js handles adding authenticity_token upon submit • JavaScript disabled? ◦ Rails 3 embeds token in form. Rails 4 does not. • :authenticity_token => true
  26. Deprecation Policy • "RailsVer" • 4.0 mostly just deprecates •

    4.1 removes those features ◦ Or provides them as gems you yourself must add to Gemfile • 5.0 removes support for some of those gems
  27. More Resources • Rails 4.0 Release Notes • Rails 4.0

    Mind Map • Boston.rb: What to Expect in Rails 4.0 • Edgerails.info Blog
  28. Routing Concerns # routes.rb concern :commentable do |options| resources :comments,

    options end concern :image_attachable do resources :images, only: :index end resources :posts, concerns: [:commentable, : image_attachable] do resource :video, concerns: :commentable end
  29. activeresource extracted from rails • gem 'rails' no longer gets

    you activeresource • activeresource will have its own release cycle
  30. Relation#___! posts = Post.all # Rails 3 posts = posts.where(title:

    "foo") # Rails 4 posts.where!(title: "foo")