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

O que mudou no Rails 5

O que mudou no Rails 5

Palestra apresentada no GURU-SP em 23/07/2016

Cb5d9e9095cd41b636764a85e57ade4b?s=128

Nando Vieira

July 26, 2016
Tweet

Transcript

  1. O que mudou no Rails 5

  2. O que mudou no Rails 5

  3. NANDO VIEIRA

  4. None
  5. None
  6. 5.0.0 9999 948 1410 30 de Junho de 2016 Commits

    Contributors Commits do Rafael França SOBRE O RAILS 5
  7. O QUE MUDOU NO ACTIVE MODEL

  8. ATRIBUIÇÃO DE PROPRIEDADES O mecanismo de atribuição agora pode ser

    adicionado com um módulo.
  9. class Feedback include ActiveModel::AttributeAssignment attr_accessor :name, :email, :message def initialize(attrs

    = {}) assign_attributes(attrs) end end Feedback.new(name: "John Doe", email: "john@example.com")
  10. DETALHES SOBRE ERROS DE VALIDAÇÃO Obtenha os detalhes de uma

    falha de validação organizadas em um objeto, e não apenas a mensagem de erro.
  11. class Feedback include ActiveModel::Validations validates_presence_of :name attr_accessor :name, :email, :message

    end feedback = Feedback.new feedback.valid? feedback.errors.details #=> {:name=>[{:error=>:blank}]}
  12. O QUE MUDOU NO ACTIVE RECORD

  13. UMA NOVA BASE CLASS FOI ADICIONADA Novos modelos irão herdar

    da classe ApplicationRecord.
  14. # app/models/application_record.rb class ApplicationRecord < ActiveRecord::Base self.abstract_class = true end

    # app/models/user.rb class User < ApplicationRecord end
  15. AS MIGRAÇÕES SÃO VERSIONADAS Isso permite evoluir a API de

    migrações sem quebrar a compatibilidade com versões anteriores.
  16. class CreateUsers < ActiveRecord::Migration def change create_table :users do |t|

    t.text :name, null: false t.timestamps null: false end end end class CreateUsers < ActiveRecord::Migration[5.0] def change create_table :users do |t| t.text :name, null: false t.timestamps end end end RAILS 4.2 RAILS 5.0 [4.2]
  17. associações timestamps são indexadas por padrão são obrigatórios por padrão

    MIGRATION[5.0]
  18. NOVO MECANISMO DE GERAÇÃO DE TOKENS Agora é possível gerar

    tokens não- criptografados.
  19. class User < ActiveRecord::Base has_secure_token has_secure_token :api_token end user =

    User.create! user.token #=> vRY6dT6oZ6r34JfkGSCrNj1Y user.api_token #=> irrSmfeEGLFDW8rp7NLRjUKf user.regenerate_api_token user.api_token #=> WNMtbZwHzbrMNkckXWaGR51B
  20. NOVA API DE DEFINIÇÃO DE ATRIBUTOS É uma maneira sana

    de definir como os atributos de seu banco de dados irão ser convertidos em tipos do Ruby, e vice-versa.
  21. class User < ActiveRecord::Base attribute :api_token, EncryptedStringType.new(API_TOKEN_ENCRYPTION_KEY) end user =

    User.create(api_token: "secret") #=> INSERT INTO "users" ("api_token", "created_at", "updated_at") VALUES (?, ?, ?) [["api_token", "IY9mwZbvAwilc0tHEfhBtA=="], ["created_at", 2016-07-23 05:22:18 UTC], ["updated_at", 2016-07-23 05:22:18 UTC]] user.api_token #=> secret User.where(api_token: "secret").to_sql #=> SELECT "users".* FROM "users" WHERE "users"."api_token" = 'IY9mwZbvAwilc0tHEfhBtA=='
  22. class EncryptedStringType < ActiveRecord::Type::Value def initialize(key) @key = key end

    def serialize(value) Encryptor.encrypt(@key, value) if value end def deserialize(value) Encryptor.decrypt(@key, value) if value end def cast(value) value.to_s if value end end
  23. class Encryptor def self.encrypt(key, value) encode cipher(key, :encrypt, value) end

    def self.decrypt(key, value) cipher(key, :decrypt, decode(value)) end def self.encode(value) Base64.encode64(value).gsub(/\n/, "") end def self.decode(value) Base64.decode64(value) end def self.cipher(key, mode, value) cipher = OpenSSL::Cipher.new("AES-256-CBC").public_send(mode) cipher.key = key cipher.iv = Digest::SHA512.hexdigest(key)[0...cipher.iv_len] cipher.update(value) + cipher.final end end
  24. CALLBACK HALTING AGORA É EXPLÍCITO. Algumas vezes explícito é melhor

    que implícito.
  25. class User < ActiveRecord::Base before_create :set_receive_newsletter private def set_receive_newsletter self.receive_newsletter

    ||= false end end User.create! #=> ActiveRecord::RecordNotSaved: Failed to save the record RAILS 4.2 RAILS 5.0 User.create! #=> #<User id: 1 ...>
  26. ActiveSupport.halt_callback_chains_on_return_false = false

  27. class User < ActiveRecord::Base before_destroy :prevent_record_destruction private def prevent_record_destruction throw(:abort)

    end end user.destroy! #=> ActiveRecord::RecordNotDestroyed: Failed to destroy the record
  28. OR. OR. OR. OR. OR. OR. OR. OR. OR. OR.

    OR. OR. OR. OR. Agora podemos usar OR. Eles são otimizados para serem usados com named scopes.
  29. relation.or(another_relation)

  30. class Article < ActiveRecord::Base def self.highlights pinned.or(recent) end def self.pinned

    where(pinned: true) end def self.recent where("published_at > ?", 1.week.ago) end end
  31. User .where(email: params[:credentials]) .or(User.where(username: params[:credentials])) .first Embora seja possível, este

    caso de uso não é recomendado.
  32. O QUE MUDOU NO ACTION PACK

  33. PARAMS NÃO HERDA MAIS DE HASH. Se você usa Hash#slice,

    reveja seu código.
  34. params = ActionController::Parameters.new(person: {name: "John Doe", admin: true}) person_params =

    params.require(:person).permit(:name) person_params.to_h #=> {"name"=>"John Doe"}
  35. RENDERIZE TEMPLATES DE FORA DO CONTROLLER. Finalmente temos uma opção

    oficial sem hacks.
  36. OrdersController.render :show, assigns: {order: some_order}

  37. ApplicationController.renderer.defaults.merge! http_host: "example.com", https: true

  38. TESTES DE CONTROLLERS NÃO SÃO RECOMENDADOS. Agora você deve utilizar

    testes de integração.
  39. 5.0 5.1 deprecated gem separada TESTES DE CONTROLLER

  40. A ASSINATURA DOS HELPERS DE TESTE MUDOU. Agora você deve

    utilizar testes de integração.
  41. get path, params: {}, headers: {}, env: {}, xhr: false

  42. ACTIONS SEM TEMPLATES RETORNAM STATUS 204. O Rails retorna status

    204 (No Content) para actions que não tem um template definido.
  43. RAILS 4 ActionView::MissingTemplate (Missing template users/create) No template found for

    UsersController#create, rendering head :no_content Completed 204 No Content in 41ms RAILS 5
  44. O QUE É RAILS API

  45. APLICAÇÃO OTIMIZADA PARA A CRIAÇÃO DE APIS. Remova o que

    não é necessário para a criação de APIs.
  46. $ rails new backend --api

  47. MIDDLEWARE BASE CONTROLLER GENERATORS Stack reduzido ActionController::API Não geram views,

    helpers e assets.
  48. OUTPUT DE ERROS PRÓPRIA PARA A API. Agora temos uma

    resposta apropriada para casos de erros.
  49. { "status": 404, "error": "Not Found", "exception": "#<ActionController::RoutingError: No route

    matches [GET] \"/posts.json \">", "traces": { "Application Trace":[], "Framework Trace":[] } }
  50. O QUE MUDOU NA COMMAND-LINE

  51. O COMANDO RAILS AGORA EXECUTA RAKE TASKS. O uso da

    CLI ficou muito mais intuitivo agora que todos os comandos foram centralizados no comando `rails`.
  52. rake routes rake test rake db:migrate rails routes rails test

    rails db:migrate RAILS 4 RAILS 5
  53. EXECUTAR TESTES FICOU MUITO MELHOR. O uso da CLI ficou

    muito mais intuitivo agora que todos os comandos foram centralizados no comando `rails`.
  54. rails test rails test <file> rails test <file>:<line number> rails

    test --fail-fast rails test --backtrace
  55. None
  56. None
  57. O QUE MUDOU NO TURBOLINKS

  58. SINGLE-PAGE APPLICATIONS Turbolinks é a resposta do Ruby on Rails

    para single-page applications.
  59. MOBILE É CADA VEZ MAIS IMPORTANTE. Com a necessidade de

    prover conteúdo para mobile users, a complexidade aumentou muito.
  60. TURBOLINKS 5 Introduz frameworks que ajudam no desenvolvimento de apps

    híbridos para iOS e Android, usando como base páginas HTML e CSS.
  61. None
  62. O QUE É O ACTION CABLE

  63. COMUNICAÇÃO FULL- DUPLEX COM WEBSOCKETS Mecanismo simplificado de comunicação entre

    cliente e servidor e vice-versa.
  64. O QUE MAIS MUDOU NO RAILS 5 ⋆

  65. NOVA PÁGINA DE BOAS VINDAS. Com a nova identidade visual

    do Ruby on Rails, veio uma nova página de boas vindas.
  66. None
  67. None
  68. EXIGE RUBY 2.2.2 OU SUPERIOR Lembre-se que a versão 2.4.0

    está quase aí.
  69. BLOG POST RELEASE NOTES BIG BINARY CHANGELOG http://fnando.me/1fr http://fnando.me/1fo http://fnando.me/1fp

    http://fnando.me/1fq
  70. @fnando OBRIGADO.