samnang
6/19/2012 - 5:11 AM

Use presenter class instead of overriding as_json

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