Rails - Como transformar seus modelos para JSON

Renan PortoRenan Porto
1 min read

Vamos pensar no cenário em que eu possuo uma Model Customer e eu pretendo retorna-lá como JSON em alguma parte da minha aplicação:

class Customer
  include ActiveModel::Model
  attr_accessor :id, :name

  validates :id, presence: true, numericality: { only_integer: true }
  validates :name, presence: true
end

Para fazer isso, basta eu chamar a instancia da minha entidade e dar um to_json, certo? Vamos validar isso:

customer = Customer.new(id: 123, name: 'Renan')
customer.to_json

# output: "{\"id\":123,\"name\":\"Renan\"}"

Tudo funcionou como esperado. Mas então sobre o que é essa publicação?

Sobre o cenário em que eu preciso validar a minha entidade. Vamos simplesmente adicionar um customer.valid? antes de converter para JSON:

customer = Customer.new(id: 123, name: 'Renan')
customer.valid? # true
customer.to_json

# output: "{\"id\":123,\"name\":\"Renan\",\"validation_context\":null,\"errors\":{}}"

Ops! Agora temos 2 novas chaves, validation_context e errors, devido a validação do ActiveModel.

Como podemos resolver isso? Simples:

class Customer
  include ActiveModel::Model
  attr_accessor :id, :name

  validates :id, presence: true, numericality: { only_integer: true }
  validates :name, presence: true

  def as_json
      super(except: %w[errors validation_context])
  end
end

Basicamente sobrescrevemos a função as_json, chamando a função original e pedindo para não transformar os campos errors e validation_context.

Com isso, temos o resultado esperado:

customer = Customer.new(id: 123, name: 'Renan')
customer.valid? # true
customer.to_json # "{\"id\":123,\"name\":\"Renan\"}"

É isso por hoje :) .. espero ter ajudado alguém.

0
Subscribe to my newsletter

Read articles from Renan Porto directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Renan Porto
Renan Porto