Use presenter class instead of overriding as_json
# app/presenters/user_presenter.rb
class UserPresenter
def initialize(user)
@user = user
end
def as_json(*)
{
'id' => @user.id,
'email' => @user.email,
'name' => @user.name,
'first_name' => @user.first_name,
'last_name' => @user.last_name,
'complex_attribute' => complex_attribute, # Any complex attribute could do in just a method
'urls' => {
'self' => "#{YourApp.api_url}/me",
'friends' => "#{YourApp.api_url}/friends",
}
}
end
private
def complex_attribute
#...
end
end
# app/controller/users_controller.rb
class UsersController < ApplicationController
#...
def show
#...
render :json => UserPresenter.new(@user).as_json
end
end