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.
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
enddef show
render json: ProdutoSerializer.new(@produto).serializable_hash
endProdutoSerializer.new(@produto).serializable_hashRepare: 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.