diff --git a/Introduction-to-Drops.md b/Introduction-to-Drops.md new file mode 100644 index 0000000..32b5b68 --- /dev/null +++ b/Introduction-to-Drops.md @@ -0,0 +1,66 @@ +# Liquid Drops + +Drops let you provide the user with custom functionality. They're very much like a standard Ruby class, but have all un-needed and potentialy dangerous methods removed. From the user's perspective a drop acts very much like a Hash, thought methods are accessed with dot-notation aswell as element selection. A drop method cannot be invoked with arguments. Drops are called just-in-time thus allowing you to lazily load objects. + +## Standard drop methods: + +before_method(method): + +Called once for every invokation, even if the destination method doesn't exist. Can be used to provide dynamically named methods. + +Example: + + class MembersDrop < Liquid::Drop + + def before_method(method) + user = User.find_by_name(method) + user ? UserDrop.new(user) : nil + end + + end + +### View + + {% assign user = members.ian %} {{ user.name }} + +invoke_drop(method): + +Called by liquid to invoke the target drop method. + +has_key(name): + +Currently returns true regardless. + +to_liquid: + +Returns the drop instance. + +### Drop usage: + + class ProductDrop < Liquid::Drop + + def initialize(product) + @product = product + end + + def name + @product[:name] + end + + def description + @product[:description] + end + + def price + @product[:price] + end + + end + +### Controller + + template = Liquid::Template.parse( File.read( product_view.liquid ) ) template.render( { :product => ProductDrop.new(@product) } ) + +### View + + Viewing product: {{ product.name }}

{{ product.description }}
£{{ product.price }} \ No newline at end of file