class Liquid::Rails::Drop

Attributes

_associations[RW]
_attributes[RW]
object[R]

Public Class Methods

associate(type, attrs) click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 64
def self.associate(type, attrs)
  options = attrs.extract_options!
  self._associations = _associations.dup

  attrs.each do |attr|
    next if method_defined?(attr)

    define_method attr do
      value = instance_variable_get("@_#{attr}")
      return value if value

      association = object.send(attr)
      return nil if association.nil?

      drop_instance = Liquid::Rails::Drop.dropify(association, options)
      instance_variable_set("@_#{attr}", drop_instance)
    end

    self._associations[attr] = { type: type, options: options }
  end
end
attributes(*attrs) click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 15
def self.attributes(*attrs)
  @_attributes.concat attrs

  attrs.each do |attr|
    next if method_defined?(attr)

    define_method(attr) do
      object.send(attr)
    end
  end
end
belongs_to(*attrs) click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 52
def self.belongs_to(*attrs)
  associate(:belongs_to, attrs)
end
drop_class_for(resource) click to toggle source

By default, `Product` maps to `ProductDrop`.

Array of products maps to `Liquid::Rails::CollectionDrop`.
# File lib/liquid-rails/drops/drop.rb, line 29
def self.drop_class_for(resource)
  if resource.respond_to?(:to_ary)
    Liquid::Rails::CollectionDrop
  else
    if self == Liquid::Rails::Drop
      resource.drop_class
    else
      self
    end
  end
end
dropify(resource, options={}) click to toggle source

Create a drop instance when it cannot be inferred.

# File lib/liquid-rails/drops/drop.rb, line 42
def self.dropify(resource, options={})
  drop_class = if options[:class_name]
    options[:class_name].constantize
  else
    drop_class_for(resource)
  end

  drop_class.new(resource, options.except(:class_name))
end
has_many(*attrs) click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 56
def self.has_many(*attrs)
  associate(:has_many, attrs)
end
has_one(*attrs) click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 60
def self.has_one(*attrs)
  associate(:has_one, attrs)
end
inherited(base) click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 10
def self.inherited(base)
  base._attributes   = []
  base._associations = {}
end
new(object, options={}) click to toggle source

Wraps an object in a new instance of the drop.

# File lib/liquid-rails/drops/drop.rb, line 87
def initialize(object, options={})
  @object = object
end

Public Instance Methods

==(other) click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 117
def ==(other)
  other.present? && other.object == @object
end
as_json(options={}) click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 97
def as_json(options={})
  attributes.as_json(options)
end
attributes() click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 91
def attributes
  @attributes ||= self.class._attributes.dup.each_with_object({}) do |name, hash|
    hash[name.to_s] = send(name)
  end
end
inspect() click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 113
def inspect
  "#<#{self.class.name} @object: #{object.inspect} @attributes: #{attributes.inspect}>"
end
liquid_method_missing(method) click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 105
      def liquid_method_missing(method)
        return nil unless @context && @context.strict_variables
        raise ::Liquid::UndefinedDropMethod, <<~HEREDOC
          undefined method #{method} for #{self.class}
          Did you forget to add it to `attributes`?
        HEREDOC
      end
to_json(options={}) click to toggle source
# File lib/liquid-rails/drops/drop.rb, line 101
def to_json(options={})
  as_json.to_json(options)
end