sseletskyy
10/3/2013 - 7:19 PM

base_serializer.rb

# serialize a comment to json:
# 
#   CommentSerializer.new(c).as_json
#   => {
#	"id"=>1,
#	"html_body"=>"lorem ipsum dolor...",
#	"created_at"=>"2013-07-26T10:38:47-07:00",
#	"user"=>{
#		"id"=>1,
#		"name"=>"Matthew"
#	}
#    }
class CommentSerializer < BaseSerializer

  private

    def serialize(object, options={})
      super(object, options).tap do |json|
        json['link'] = user_path(serialized_object)
      end
    end

    def attributes
      %w(id created_at)
    end

    def includes
      { 'user' => { 'only' => %w(id name) } }
    end

    def methods
      %w(html_body)
    end
end
# An abstract base class used to create simple serializers
# for ActiveRecord objects
class BaseSerializer
  include Rails.application.routes.url_helpers

  attr_reader :serialized_object

  def initialize(serialized_object)
    @serialized_object = serialized_object
  end
	
  def as_json(options={})
    if serialized_object.respond_to?(:to_ary)
      serialized_object.map { |object| serialize(object, options) }
    else
      serialize(serialized_object, options)
    end
  end

  private

    # serialize a single instance
    def serialize(object, options={})
      object.as_json(as_json_options.merge(options))
    end

    # the default options passed to as_json
    def as_json_options
      { :only    => attributes, 
        :methods => methods, 
        :include => includes }
    end

    # hook methods
    def attributes ; end
    def includes   ; end
    def methods    ; end
end