Sha256: c328cb60b624a257c946f7c541bf97e713d6549a3e3f7fcca92bd87d6eba6530

Contents?: true

Size: 1.92 KB

Versions: 32

Compression:

Stored size: 1.92 KB

Contents

module Locomotive
  module Mongoid

    module Presenter

      extend ActiveSupport::Concern

      included do
        # keep a link to the original as_json method from Mongoid
        alias :as_json_from_mongoid :as_json

        # keeps track of the presenter class
        class << self; attr_writer :presenter_class end
      end

      # Get the presenter corresponding to the current document
      #
      # @return [ Object ] The presenter
      #
      def to_presenter(options = {})
        return nil unless self.class.presenter_class
        self.class.presenter_class.new(self, options)
      end

      # Set the attributes of the document by using
      # the corresponding presenter.
      #
      # @param [ Hash ] attributes The document attributes
      #
      def from_presenter(attributes = {})
        self.to_presenter.attributes = attributes
      end

      def as_json(options = {})
        if presenter = self.to_presenter(options)
          presenter.as_json
        else
          self.as_json_from_mongoid(options)
        end
      end

      module ClassMethods

        # Return the memoized presenter class if it exists.
        #
        # @return [ Class ] The presenter class
        #
        def presenter_class
          return @presenter_class if @presenter_class
          _name             = "Locomotive::#{name.demodulize}Presenter"
          @presenter_class  = _name.constantize rescue nil
        end

        # Initialize an instance of the document by passing
        # attributes calculated by the associated presenter.
        #
        # @param [ Hash ] attributes The document attributes
        #
        # @return [ Object ] A new document instance filled with the parameters
        #
        def from_presenter(attributes)
          new.tap do |document|
            presenter = document.to_presenter
            presenter.attributes = attributes
          end
        end

      end

    end

  end
end

Version data entries

32 entries across 32 versions & 2 rubygems

Version Path
locomotive_cms-2.5.7 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.6 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.6.rc2 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.6.rc1 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.5 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.4 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.3 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.2 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.1 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.0 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.0.rc3 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.0.rc2 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.5.0.rc1 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.4.1 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.4.0 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.3.1 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.3.0 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.2.3 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.2.2 lib/locomotive/mongoid/presenter.rb
locomotive_cms-2.2.1 lib/locomotive/mongoid/presenter.rb