Rails - Como transformar seus modelos para JSON
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.
Subscribe to my newsletter
Read articles from Renan Porto directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by