class Shamu::JsonApi::Presenter

Presenters are responsible for projecting an {Entities::Entity} or PORO to a well-formatted JSON API {ResourceBuilder builder} response.

{Presenter} delegates all of the {ResourceBuilder} methods for convenient syntax.

“` class UserPresenter < ApplicationPresenter

def present
  identifier :user, resource.id

  attributes name: resource.name,
             email: resource.email

  relationship( :address ) do |rel|
    rel.identifier :address, resource.address_id
    rel.link :related, user_address_url( resource, resource.address_id )
  end
end

end “`

Attributes

builder[R]
resource[R]

Public Class Methods

new( resource, builder ) click to toggle source

@param [Object] resource to presenter. @param [ResourceBuilder] builder used to build the JSON API response.

# File lib/shamu/json_api/presenter.rb, line 29
def initialize( resource, builder )
  @resource = resource
  @builder  = builder
end

Public Instance Methods

present() click to toggle source

Serialize the `resource` to the `builder`.

@return [void]

# File lib/shamu/json_api/presenter.rb, line 37
def present
  fail NotImplementedError
end

Private Instance Methods

attribute_value( value ) click to toggle source

Get a JSON API safe version of the value. @param [Object] value the value to be coerced. @return [Object]

# File lib/shamu/json_api/presenter.rb, line 60
def attribute_value( value )
  case value
  when Date, DateTime then
    value.to_date.iso8601
  when Time, ActiveSupport::TimeWithZone then
    value.iso8601
  else value
  end
end
resource_attributes( *names ) click to toggle source

Present all the named attributes of the {#resource}. @param [Array<Symbol>] names of the resource to present.

# File lib/shamu/json_api/presenter.rb, line 51
def resource_attributes( *names )
  names.map do |name|
    attribute name, attribute_value( resource.send( name ) )
  end
end