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

Rails 4

Rails 4

Quer saber o que mudou no Rails 4? Nessa palestra eu mostrei grande parte das novidades que esta nova versão trouxe.

Palestra apresentada no TDC 2013

Nando Vieira

July 14, 2013
Tweet

More Decks by Nando Vieira

Other Decks in Programming

Transcript

  1. O Rails 4 foi lançado em 25 de junho de

    2013. http://fnando.me/i1
  2. # app/models/user.rb class User < ActiveRecord::Base attr_accessible :email, :username end

    # app/controllers/users_controller.rb class UsersController < ApplicationController def create @user = User.create(params[:user]) respond_with(@user) end end Rails 3
  3. # app/controllers/users_controller.rb class UsersController < ApplicationController def create @user =

    User.create(user_params) respond_with(@user) end private def user_params params .require(:user) .permit(:email, :username) end end Rails 4
  4. Turbolinks faz requisições com AJAX e substitui as ta s

    <title> e <body> com o conteúdo retornado pelo servidor.
  5. $(document).on("page:change", function(){ if (window._gaq) { _gaq.push(["_trackPageview"]); } else if (window.pageTracker)

    { pageTracker._trackPageview(); } }); http://reed. ithub.io/turbolinks-compatibility/
  6. post = Post.new post.title = "Array support on ActiveRecord +

    PostgreSQL" post.tags = %w[rails ruby database] post.save p post.tags # ["rails", "ruby", "database"] p Post.where("? = ANY(tags)", "ruby").first # #<Post id: 1, tags: ["rails", "ruby", "database"]>
  7. user = User.new user.username = "fnando" user.profile = { github:

    "fnando", twitter: "fnando", instagram: "nandovieira" } user.save p user.profile # {:github=>"fnando"...}
  8. # Find users with github key User.where("profile ? :key", key:

    "github") # Find users without github key User.where("not profile ? :key", key: "github") # Find users with github profile as fnando User.where("profile @> (:key => :value)", key: "github", value: "fnando" ) # Find users with with instagram value like "nan" User.where("profile -> :key LIKE :value", key: "instagram", value: "%nan%" )
  9. Indices GIN Rápidos para buscar. Lentos para indexar. São melhores

    quando existem mais de 100 mil termos únicos. http://fnando.me/j
  10. Indices GiST Mais lentos que GIN. Mais rápidos para indexar.

    São melhores quando o número de termos únicos for abaixo de 100 mil.
  11. uuid inet cidr macaddr json ran es Universally Unique Identifier

    Endereço IPv4 Endereço IPv6 MAC Address Serialização com JSON int4ran e, int8ran e, numran e, tsran e, tstzran e, dateran e
  12. class Topic < ActiveRecord::Base def self.filter(filter) case filter when :all

    all when :published where(published: true) when :draft where(published: false) else where("1 = 0") end end end Rails 3
  13. class Topic < ActiveRecord::Base def self.filter(filter) case filter when :all

    all when :published where(published: true) when :draft where(published: false) else none end end end Rails 4
  14. class User < ActiveRecord::Base before_destroy :avoid_destruction private def avoid_destruction false

    end end user = User.create!(username: "fnando") user.destroy user.persisted? #=> true user.destroy! #=> exception ActiveRecord::RecordNotDestroyed
  15. SELECT "users".* FROM "users" WHERE "users"."username" = 'fnando' ORDER BY

    "users"."created_at" DESC scope = User.all scope.where!(username: "fnando") scope.includes!(:articles) scope.order!(created_at: :desc) scope.to_sql SQL RUBY
  16. Até o Rails 3 todos os dados salvos na sessão

    podiam ser vistos pelo cliente.
  17. $ curl -i http://localhost:3000/ HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8

    X-Ua-Compatible: IE=Edge Etag: "8b1a9953c4611296a827abf8c47804d7" Cache-Control: max-age=0, private, must-revalidate X-Request-Id: 25af60321d6e9c585c3f04ff8928d824 X-Runtime: 0.014431 Server: WEBrick/1.3.1 (Ruby/2.0.0/2013-06-27) Date: Sat, 13 Jul 2013 20:13:58 GMT Content-Length: 5 Connection: Keep-Alive Set-Cookie: _app_session=BAh7BzoMbWVzc2hh...; path=/; HttpOnly
  18. O Rails 4 usa cookies cripto rafados com o hash

    definido em Rails.application.confi .secret_key_base.
  19. class Contact include ActiveModel::Validations include ActiveModel::Conversion extend ActiveModel::Naming attr_accessor :name,

    :email, :message validates_presence_of :name, :message validates_format_of :email, with: /\A.+@.+\.[a-z]{2,4}\z/ def initialize(attributes = {}) attributes.each do |name, value| public_send("#{name}=", value) end end def persisted? false end end
  20. class Contact include ActiveModel::Model attr_accessor :name, :email, :message validates_presence_of :name,

    :message validates_format_of :name, with: /\A.+@.+\.[a-z]{2,4}\z/ end
  21. No Rails 3 você precisa definir todas as chaves que

    compõe o ETa , mesmo que elas sejam a mesma em todo o controller.
  22. class ReposController < ApplicationController etag { current_user.id } def show

    @repo = current_user.repos.find(params[:id]) fresh_when(@repo) end end
  23. O cachin de fra mentos também ficou mais simples com

    a nova estraté ia de russian doll cachin .
  24. No Rails 3 você precisava definir uma versão do fra

    mento e atualizar seu valor caso o markup mudasse.
  25. <!-- app/views/posts/index.html.erb --> <%= render @posts %> <!-- app/views/posts/_post.html.erb -->

    <% cache ["v1", post] do %> <article class="post"> <%= link_to post.title, post_path(post) %> </article> <% end %>
  26. <!-- app/views/posts/show.html.erb --> <% cache ["v1", @post, "details"] do %>

    <h1><%= @post.title %></h1> <%= simple_format @post.content %> <%= render @post.comments %> <% end %> <!-- app/views/comments/_comment.html.erb --> <% cache ["v1", comment] do %> <article class="comment"> <%= simple_format comment.content %> </article> <% end %>
  27. No Rails 4 você não precisa mais adicionar a versão

    do cache, pois isso é calculado automaticamente.
  28. <!-- app/views/posts/_post.html.erb --> <% cache post do %> <article class="post">

    <%= link_to post.title, post_path(post) %> </article> <% end %> <% cache [@post, "details"] do %> <h1><%= @post.title %></h1> <%= simple_format @post.content %> <%= render @post.comments %> <% end %> <% cache comment do %> <article class="comment"> <%= simple_format comment.content %> </article> <% end %>
  29. O cache di est só é calculado uma vez, mesmo

    em modo de desenvolvimento. Reinicie o memcached ou o app server para recalculá-lo.
  30. User.find_all_by_role("admin") # Rails 3 User.where(role: "admin") # Rails 4 User.find_last_by_role("admin")

    # Rails 3 User.where(role: "admin").last # Rails 4 User.find_or_create_by_role("admin") # Rails 3 User.find_or_create_by(role: "admin") # Rails 4 User.find_or_initialize_by_role("admin") # Rails 3 User.find_or_initialize_by(role: "admin") # Rails 4 User.scoped_by_role("admin") # Rails 3 User.where(role: "admin") # Rails 4 User.all(role: "admin") # Rails 3 User.where(role: "admin") # Rails 3
  31. User.find(:first) # Rails 3 User.first # Rails 4 User.find(:last) #

    Rails 3 User.last # Rails 4 User.find(:all) # Rails 3 User.all # Rails 4
  32. O verbo HTTP de atualização de resources foi alterado de

    PUT para PATCH. https:// ithub.com/rails/rails/pull/505
  33. test user_test.rb repo_test.rb models application_helper_test.rb html_helper_test.rb helpers mailer_test.rb mailers #

    antes era test/units # antes era test/units/helpers # antes era test/functional application_controller_test.rb repos_controller_test.rb controllers # antes era test/functional
  34. A pá ina de boas-vindas a ora é dinâmica e

    exibida apenas em modo de desenvolvimento quando a rota root não tiver sido definida.