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. 4.
  2. 5.
  3. 6.

    5.0.0 9999 948 1410 30 de Junho de 2016 Commits

    Contributors Commits do Rafael França SOBRE O RAILS 5
  4. 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")
  5. 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.
  6. 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}]}
  7. 15.

    AS MIGRAÇÕES SÃO VERSIONADAS Isso permite evoluir a API de

    migrações sem quebrar a compatibilidade com versões anteriores.
  8. 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]
  9. 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
  10. 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.
  11. 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=='
  12. 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
  13. 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
  14. 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 ...>
  15. 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
  16. 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.
  17. 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
  18. 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"}
  19. 40.
  20. 42.

    ACTIONS SEM TEMPLATES RETORNAM STATUS 204. O Rails retorna status

    204 (No Content) para actions que não tem um template definido.
  21. 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
  22. 45.

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

    não é necessário para a criação de APIs.
  23. 48.

    OUTPUT DE ERROS PRÓPRIA PARA A API. Agora temos uma

    resposta apropriada para casos de erros.
  24. 49.

    { "status": 404, "error": "Not Found", "exception": "#<ActionController::RoutingError: No route

    matches [GET] \"/posts.json \">", "traces": { "Application Trace":[], "Framework Trace":[] } }
  25. 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`.
  26. 53.

    EXECUTAR TESTES FICOU MUITO MELHOR. O uso da CLI ficou

    muito mais intuitivo agora que todos os comandos foram centralizados no comando `rails`.
  27. 54.
  28. 55.
  29. 56.
  30. 59.

    MOBILE É CADA VEZ MAIS IMPORTANTE. Com a necessidade de

    prover conteúdo para mobile users, a complexidade aumentou muito.
  31. 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.
  32. 61.
  33. 65.

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

    do Ruby on Rails, veio uma nova página de boas vindas.
  34. 66.
  35. 67.