Class: Liquid::Drop

Inherits:
Object
  • Object
show all
Defined in:
lib/liquid/drop.rb

Overview

A drop in liquid is a class which allows you to export DOM like things to liquid. Methods of drops are callable. The main use for liquid drops is to implement lazy loaded objects. If you would like to make data available to the web designers which you don’t want loaded unless needed then a drop is a great way to do that.

Example:

class ProductDrop < Liquid::Drop
  def top_sales
    Shop.current.products.find(:all, :order => 'sales', :limit => 10 )
  end
end

tmpl = Liquid::Template.parse( ' {% for product in product.top_sales %} {{ product.name }} {%endfor%} '  )
tmpl.render('product' => ProductDrop.new ) # will invoke top_sales query.

Your drop can either implement the methods sans any parameters or implement the liquid_method_missing(name) method which is a catch all.

Direct Known Subclasses

ForloopDrop, TablerowloopDrop

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDrop

Returns a new instance of Drop.



28
29
30
# File 'lib/liquid/drop.rb', line 28

def initialize
  @context = nil
end

Instance Attribute Details

#context=(value) ⇒ Object (writeonly)

Sets the attribute context

Parameters:

  • value

    the value to set the attribute context to.



26
27
28
# File 'lib/liquid/drop.rb', line 26

def context=(value)
  @context = value
end

Class Method Details

.invokable?(method_name) ⇒ Boolean

Check for method existence without invoking respond_to?, which creates symbols

Returns:

  • (Boolean)


66
67
68
# File 'lib/liquid/drop.rb', line 66

def self.invokable?(method_name)
  invokable_methods.include?(method_name.to_s)
end

.invokable_methodsObject



70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/liquid/drop.rb', line 70

def self.invokable_methods
  @invokable_methods ||= begin
    blacklist = Liquid::Drop.public_instance_methods + [:each]

    if include?(Enumerable)
      blacklist += Enumerable.public_instance_methods
      blacklist -= [:sort, :count, :first, :min, :max]
    end

    whitelist = [:to_liquid] + (public_instance_methods - blacklist)
    Set.new(whitelist.map(&:to_s))
  end
end

Instance Method Details

#inspectObject



51
52
53
# File 'lib/liquid/drop.rb', line 51

def inspect
  self.class.to_s
end

#invoke_drop(method_or_key) ⇒ Object Also known as: []

called by liquid to invoke a drop



39
40
41
42
43
44
45
# File 'lib/liquid/drop.rb', line 39

def invoke_drop(method_or_key)
  if self.class.invokable?(method_or_key)
    send(method_or_key)
  else
    liquid_method_missing(method_or_key)
  end
end

#key?(_name) ⇒ Boolean

Returns:

  • (Boolean)


47
48
49
# File 'lib/liquid/drop.rb', line 47

def key?(_name)
  true
end

#liquid_method_missing(method) ⇒ Object

Catch all for the method



33
34
35
36
# File 'lib/liquid/drop.rb', line 33

def liquid_method_missing(method)
  return nil unless @context&.strict_variables
  raise Liquid::UndefinedDropMethod, "undefined method #{method}"
end

#to_liquidObject



55
56
57
# File 'lib/liquid/drop.rb', line 55

def to_liquid
  self
end

#to_sObject



59
60
61
# File 'lib/liquid/drop.rb', line 59

def to_s
  self.class.name
end