Aprenda / Ruby on Rails

FundamentosAula 6 de 2014 min0% da trilha

Serializers

render json: @model devolve TODAS as colunas — serializer decide exatamente o que sai.

render json: @produto funciona, mas devolve todas as colunas da tabela — inclusive as que você nunca quis expor, tipo um custo_interno ou o created_at bruto sem formatação. Um serializer é a camada que decide, explicitamente, o formato do JSON de resposta.

app/serializers/produto_serializer.rb
class ProdutoSerializer
  include JSONAPI::Serializer

  attributes :nome, :preco   # só esses dois saem — custo_interno nunca aparece

  attribute :em_estoque do |produto|
    produto.estoque > 0       # atributo calculado, não existe como coluna
  end

  belongs_to :categoria        # inclui a relação, se pedido
end
controller usando o serializer
def show
  render json: ProdutoSerializer.new(@produto).serializable_hash
end
Resultado — GET /produtos/1
ProdutoSerializer.new(@produto).serializable_hash

Repare: custo_interno nunca aparece (nem foi listado em attributes); em_estoque não é uma coluna real, é calculado na hora; e o formato de resposta (data/attributes/type) é consistente pra qualquer model serializado assim — o cliente da API sempre sabe onde procurar o dado, independente do recurso.

Exercício

Um Usuario tem colunas nome, email e senha_digest. Escreva o serializer garantindo que senha_digest jamais vaze na resposta.

Quiz rápido

Qual o principal risco de usar render json: @model direto, sem serializer?
O atributo em_estoque do exemplo, calculado a partir de estoque > 0, precisa existir como coluna na tabela?