Active Model serializers: control total de JSON en Rails

Clase 15 de 33Curso de Creación de APIs con Ruby on Rails

Resumen

Gana control total sobre la salida JSON en Rails con Active Model serializers. Aquí verás cómo instalar la gema, generar el serializer de post y definir un formato claro con campos anidados, validado mediante request tests. Todo con un enfoque práctico y directo.

¿Qué problema resuelve Active Model serializers en Rails?

Cuando Rails serializa modelos, el formato por defecto puede quedarse corto. Con Active Model serializers tienes control fino sobre qué atributos incluir y cómo estructurarlos. Al crear un serializer, Rails lo usa por convención para la representación JSON del modelo asociado. Si solo incluyes el ID, las pruebas que esperan más datos fallarán, lo que confirma que debes declarar los atributos deseados.

  • Más control sobre la serialización a JSON del modelo post.
  • Convención de Rails: si existe serializer, se usa automáticamente.
  • Por defecto solo se incluye ID.
  • Formato esperado: título, contenido, publicado y un author anidado.

¿Cómo instalar y generar el serializer de post?

Primero instala la gema adicional y genera el archivo base del serializer. La gema se declara en plural: active_model_serializers versión 0.10.8.

# Gemfile
gem 'active_model_serializers', '0.10.8'

Ejecuta la instalación:

bundle install

Genera el serializer para el modelo post:

rails g serializer post

Esto crea una clase que hereda de ActiveModel::Serializer y sirve como punto central para definir la estructura JSON.

class PostSerializer < ActiveModel::Serializer
end
  • Gema adicional declarada en el Gemfile.
  • Instalación con bundle.
  • Generación con el generator serializer para post.
  • Clase creada: PostSerializer que hereda de ActiveModel::Serializer.

¿Cómo definir atributos, author anidado y validar con pruebas?

El objetivo es retornar, además del id, el título, el contenido, el estado published y un author como hash anidado con nombre, email e id. Si las pruebas de request esperan este formato, inicialmente fallarán hasta que declares los atributos en el serializer y definas el método author.

class PostSerializer < ActiveModel::Serializer
  attributes :id, :title, :content, :published, :author

  def author
    user = self.object.user
    {
      name: user.name,
      email: user.email,
      id: user.id
    }
  end
end
  • Atributos incluidos: id, title, content, published.
  • Campo author: hash embebido con name, email e id del usuario asociado.
  • Referencia al objeto serializado con self.object (el post actual).
  • Las pruebas de request se ajustan para esperar el nuevo formato y confirman la salida.

¿Qué validan las pruebas y por qué fallan al inicio?

  • Validan que se retorne id, título y contenido en el nivel raíz.
  • Verifican el hash author con name, email e id del usuario.
  • Incluyen el campo published en el post.
  • Fallan inicialmente porque el serializer solo incluía ID y no el resto de atributos.

Próximo paso natural: implementar el filtro para el endpoint de listar posts y habilitar búsquedas por distintos criterios.

¿Tienes dudas sobre qué campos incluir o cómo estructurar el author? Comparte tu caso en los comentarios y conversemos sobre el mejor formato para tus posts.