Class: Liquid::Drop
- Inherits:
-
Object
- Object
- Liquid::Drop
- 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
Instance Attribute Summary collapse
-
#context ⇒ Object
writeonly
Sets the attribute context.
Class Method Summary collapse
-
.invokable?(method_name) ⇒ Boolean
Check for method existence without invoking respond_to?, which creates symbols.
- .invokable_methods ⇒ Object
Instance Method Summary collapse
-
#initialize ⇒ Drop
constructor
A new instance of Drop.
- #inspect ⇒ Object
-
#invoke_drop(method_or_key) ⇒ Object
(also: #[])
called by liquid to invoke a drop.
- #key?(_name) ⇒ Boolean
-
#liquid_method_missing(method) ⇒ Object
Catch all for the method.
- #to_liquid ⇒ Object
- #to_s ⇒ Object
Constructor Details
#initialize ⇒ Drop
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
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
66 67 68 |
# File 'lib/liquid/drop.rb', line 66 def self.invokable?(method_name) invokable_methods.include?(method_name.to_s) end |
.invokable_methods ⇒ Object
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
#inspect ⇒ Object
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
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_liquid ⇒ Object
55 56 57 |
# File 'lib/liquid/drop.rb', line 55 def to_liquid self end |
#to_s ⇒ Object
59 60 61 |
# File 'lib/liquid/drop.rb', line 59 def to_s self.class.name end |