Slide 1

Slide 1 text

O que mudou no Rails 5

Slide 2

Slide 2 text

O que mudou no Rails 5

Slide 3

Slide 3 text

NANDO VIEIRA

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

5.0.0 9999 948 1410 30 de Junho de 2016 Commits Contributors Commits do Rafael França SOBRE O RAILS 5

Slide 7

Slide 7 text

O QUE MUDOU NO ACTIVE MODEL

Slide 8

Slide 8 text

ATRIBUIÇÃO DE PROPRIEDADES O mecanismo de atribuição agora pode ser adicionado com um módulo.

Slide 9

Slide 9 text

class Feedback include ActiveModel::AttributeAssignment attr_accessor :name, :email, :message def initialize(attrs = {}) assign_attributes(attrs) end end Feedback.new(name: "John Doe", email: "[email protected]")

Slide 10

Slide 10 text

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.

Slide 11

Slide 11 text

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}]}

Slide 12

Slide 12 text

O QUE MUDOU NO ACTIVE RECORD

Slide 13

Slide 13 text

UMA NOVA BASE CLASS FOI ADICIONADA Novos modelos irão herdar da classe ApplicationRecord.

Slide 14

Slide 14 text

# app/models/application_record.rb class ApplicationRecord < ActiveRecord::Base self.abstract_class = true end # app/models/user.rb class User < ApplicationRecord end

Slide 15

Slide 15 text

AS MIGRAÇÕES SÃO VERSIONADAS Isso permite evoluir a API de migrações sem quebrar a compatibilidade com versões anteriores.

Slide 16

Slide 16 text

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]

Slide 17

Slide 17 text

associações timestamps são indexadas por padrão são obrigatórios por padrão MIGRATION[5.0]

Slide 18

Slide 18 text

NOVO MECANISMO DE GERAÇÃO DE TOKENS Agora é possível gerar tokens não- criptografados.

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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.

Slide 21

Slide 21 text

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=='

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

CALLBACK HALTING AGORA É EXPLÍCITO. Algumas vezes explícito é melhor que implícito.

Slide 25

Slide 25 text

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! #=> #

Slide 26

Slide 26 text

ActiveSupport.halt_callback_chains_on_return_false = false

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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.

Slide 29

Slide 29 text

relation.or(another_relation)

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

User .where(email: params[:credentials]) .or(User.where(username: params[:credentials])) .first Embora seja possível, este caso de uso não é recomendado.

Slide 32

Slide 32 text

O QUE MUDOU NO ACTION PACK

Slide 33

Slide 33 text

PARAMS NÃO HERDA MAIS DE HASH. Se você usa Hash#slice, reveja seu código.

Slide 34

Slide 34 text

params = ActionController::Parameters.new(person: {name: "John Doe", admin: true}) person_params = params.require(:person).permit(:name) person_params.to_h #=> {"name"=>"John Doe"}

Slide 35

Slide 35 text

RENDERIZE TEMPLATES DE FORA DO CONTROLLER. Finalmente temos uma opção oficial sem hacks.

Slide 36

Slide 36 text

OrdersController.render :show, assigns: {order: some_order}

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

TESTES DE CONTROLLERS NÃO SÃO RECOMENDADOS. Agora você deve utilizar testes de integração.

Slide 39

Slide 39 text

5.0 5.1 deprecated gem separada TESTES DE CONTROLLER

Slide 40

Slide 40 text

A ASSINATURA DOS HELPERS DE TESTE MUDOU. Agora você deve utilizar testes de integração.

Slide 41

Slide 41 text

get path, params: {}, headers: {}, env: {}, xhr: false

Slide 42

Slide 42 text

ACTIONS SEM TEMPLATES RETORNAM STATUS 204. O Rails retorna status 204 (No Content) para actions que não tem um template definido.

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

O QUE É RAILS API

Slide 45

Slide 45 text

APLICAÇÃO OTIMIZADA PARA A CRIAÇÃO DE APIS. Remova o que não é necessário para a criação de APIs.

Slide 46

Slide 46 text

$ rails new backend --api

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

OUTPUT DE ERROS PRÓPRIA PARA A API. Agora temos uma resposta apropriada para casos de erros.

Slide 49

Slide 49 text

{ "status": 404, "error": "Not Found", "exception": "#", "traces": { "Application Trace":[], "Framework Trace":[] } }

Slide 50

Slide 50 text

O QUE MUDOU NA COMMAND-LINE

Slide 51

Slide 51 text

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`.

Slide 52

Slide 52 text

rake routes rake test rake db:migrate rails routes rails test rails db:migrate RAILS 4 RAILS 5

Slide 53

Slide 53 text

EXECUTAR TESTES FICOU MUITO MELHOR. O uso da CLI ficou muito mais intuitivo agora que todos os comandos foram centralizados no comando `rails`.

Slide 54

Slide 54 text

rails test rails test rails test : rails test --fail-fast rails test --backtrace

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

O QUE MUDOU NO TURBOLINKS

Slide 58

Slide 58 text

SINGLE-PAGE APPLICATIONS Turbolinks é a resposta do Ruby on Rails para single-page applications.

Slide 59

Slide 59 text

MOBILE É CADA VEZ MAIS IMPORTANTE. Com a necessidade de prover conteúdo para mobile users, a complexidade aumentou muito.

Slide 60

Slide 60 text

TURBOLINKS 5 Introduz frameworks que ajudam no desenvolvimento de apps híbridos para iOS e Android, usando como base páginas HTML e CSS.

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

O QUE É O ACTION CABLE

Slide 63

Slide 63 text

COMUNICAÇÃO FULL- DUPLEX COM WEBSOCKETS Mecanismo simplificado de comunicação entre cliente e servidor e vice-versa.

Slide 64

Slide 64 text

O QUE MAIS MUDOU NO RAILS 5 ⋆

Slide 65

Slide 65 text

NOVA PÁGINA DE BOAS VINDAS. Com a nova identidade visual do Ruby on Rails, veio uma nova página de boas vindas.

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

EXIGE RUBY 2.2.2 OU SUPERIOR Lembre-se que a versão 2.4.0 está quase aí.

Slide 69

Slide 69 text

BLOG POST RELEASE NOTES BIG BINARY CHANGELOG http://fnando.me/1fr http://fnando.me/1fo http://fnando.me/1fp http://fnando.me/1fq

Slide 70

Slide 70 text

@fnando OBRIGADO.