title: Active Model Serializers -- Customizing JSON response
body: <p>Quick question here. Tried searching to no avail.</p>
  
  <p>I'm working to get a RESTful API off the ground for my current project. I've found Rails to be an absolute darling for this purpose, so check another mark into rails' awesomeness!</p>
  
  <p>However I've hit a snag while designing my current API response for /users which is a method that's supposed to return a JSON array of User objects:</p>
  
  <p>My User model:</p>
  
  <pre><code>class User &lt; ActiveRecord::Base
  
    devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
  
    has_many :favorites
    has_many :reservations
  
    has_many :venues, through: :favorites
    has_many :venues, through: :reservations
  
    belongs_to  :gender
    belongs_to  :city
    belongs_to  :role
    has_one  :avatar
  
    has_many :payments
    has_one  :payment_history
  
    has_many :promotion_claims
    has_many :social_identifiers
  
  end
  </code></pre>
  
  <p>My routes:</p>
  
  <pre><code>Rails.application.routes.draw do
  
    namespace :api, defaults: { format: :json } do
      namespace :v1 do
        devise_for :users
  
        ..........................
  
        resources :roles
        resources :genders
        resources :cities
  
        #Users method
        get 'users', to: "users#index"
  
      end
    end
  </code></pre>
  
  <p>My controller:</p>
  
  <pre><code>class API::V1::UsersController &lt; API::V1::ApplicationController
    before_action :set_address, only: [:show, :edit, :update, :destroy]
  
    # GET /users
    # GET /users.json
    def index
      @users = User.all
      render json: @users
    end
  end
  </code></pre>
  
  <p>My serializers:</p>
  
  <pre><code>class UserSerializer &lt; ActiveModel::Serializer
    attributes :id, :first_name, :last_name, :cellphone, :email, :birthday, :username
    has_one :gender
    has_one :city
    has_one :role
  end
  
  class GenderSerializer &lt; ActiveModel::Serializer
    attributes :name
  end
  
  class CitySerializer &lt; ActiveModel::Serializer
    attributes :name
  end
  
  class RoleSerializer &lt; ActiveModel::Serializer
    attributes :name
  end
  </code></pre>
  
  <p>This achieves a pretty satisfying result as far as what I get as a json response:</p>
  
  <pre><code>// GET http://localhost:3000/api/v1/users
  
  [
    {
      "id": 1,
      "first_name": "Richmond",
      "last_name": "Huels",
      "cellphone": "29 8244 9100",
      "email": "coy.muller@medhurst.us",
      "birthday": "2011-02-23T19:24:00.151Z",
      "username": "alba.ortiz",
      "gender": {
        "name": "Male"
      },
      "city": {
        "name": "San Pedro Garza García"
      },
      "role": {
        "name": "admin"
      }
    },
  </code></pre>
  
  <p>However, what I want my JSON response to be is something more like:</p>
  
  <pre><code>// 20160225162402
  // GET http://localhost:3000/api/v1/users
  
  [
    {
      "id": 1,
      "first_name": "Richmond",
      "last_name": "Huels",
      "cellphone": "29 8244 9100",
      "email": "coy.muller@medhurst.us",
      "birthday": "2011-02-23T19:24:00.151Z",
      "username": "alba.ortiz",
      "gender": "Male",
      "city": "San Pedro Garza García",
      "role": "rp"
    },
  </code></pre>
  
  <p>I tried overriding the attributes method in UserSerializer and make it so I can do whatever I want with the json hash before returning it but it didn't work:</p>
  
  <pre><code>  #attributes override to get the right format for the response
    def attributes
      data = super
      data[:city] = data[:city][:name]
      data[:gender] = data[:gender][:name]
      data[:role] = data[:city][:name]
      data
    end
  </code></pre>
  
  <p>Is there any way to achieve what I need for my API?</p>
  
  <p>Thank you rubyists, you rule and keep being amazing!</p>