I''ve got Liquid installed and maybe since I''m not coming in
with Django
experience, I''m completely mystified by how to pass anything worthwhile
to a template.
In my controller:
def preview
@customer = Customer.find(1)
@letter = Letter.find(1)
@liquid_body = Liquid::Template.parse(@letter.body)
@x = @liquid_body.render(''fname'' => @customer.fname,
''customer'' =>
@customer)
@draft = render_to_string(:inline => @x)
end
In the view:
<%= draft -%>
In my template stored in the DB:
Name: {{ fname }}<br/>
Weclome {{ customer.fname }}.
The result:
{{ fname }} returns the value. {{ customer.fname }} comes up empty.
I''ve tried a few variations -- local vs. instance variables, mostly.
Surely I don''t have to manually assign an explicit hash every time I
want to pass the attributes of an AR record object to Liquid?
Obviously I''m doing something fundamentally wrong. Unfortunately, the
Liquid docs and Wiki only document what goes in the template when
dealing with an object or set of objects, not what goes in the
controller. The examples are full of constructs like {{
product.description }} and {% for product in products %} but not a word
about how @products or products are passed in.
Can someone help out with a snippet that demonstrates how to get an
object complete with attributes into Liquid?
--
Posted via http://www.ruby-forum.com/.
I know you have to write a liquid ''helper'' (helper may be th wrong term) to be able to pass ActiveRecord classes to a liquid template. There is an example in an app that uses liquid - dont remember its name. I know this post aint to helpful but what you are asking is possible it just requires some extra work... If you get the solution please post back to the forum and/or liquid docs (if you can)... Steve Koppelman wrote:> I''ve got Liquid installed and maybe since I''m not coming in with Django > experience, I''m completely mystified by how to pass anything worthwhile > to a template. > > In my controller: > > def preview > @customer = Customer.find(1) > @letter = Letter.find(1) > @liquid_body = Liquid::Template.parse(@letter.body) > @x = @liquid_body.render(''fname'' => @customer.fname, ''customer'' => > @customer) > @draft = render_to_string(:inline => @x) > end > > In the view: > > <%= draft -%> > > In my template stored in the DB: > > Name: {{ fname }}<br/> > Weclome {{ customer.fname }}. > > The result: > > {{ fname }} returns the value. {{ customer.fname }} comes up empty. > > I''ve tried a few variations -- local vs. instance variables, mostly. > Surely I don''t have to manually assign an explicit hash every time I > want to pass the attributes of an AR record object to Liquid? > > Obviously I''m doing something fundamentally wrong. Unfortunately, the > Liquid docs and Wiki only document what goes in the template when > dealing with an object or set of objects, not what goes in the > controller. The examples are full of constructs like {{ > product.description }} and {% for product in products %} but not a word > about how @products or products are passed in. > > Can someone help out with a snippet that demonstrates how to get an > object complete with attributes into Liquid?-- Posted via http://www.ruby-forum.com/.
I contacted Tobias directly and got this:
"Liquid in its default form takes strings, numerics, arrays and hashes.
A nice trick is to export @product.attributes which is a hash on every
AR object with the values. Exporting an array can be done like this:
@products = products.collect { |p| p.attributes }"
So in order to pass a single @customer object in my example using a
liquid template in the DB, you can say:
@customer = Customer.find(1)
@letter = Letter.find(1)
foo = Liquid::Template.parse(@letter.body)
foo.render(''customer'' => @customer.attributes)
and to pass a list of all customers to be iterated through in the
template, it would be something like
@customer = Customer.find(:all)
@letter = Letter.find(1)
foo = Liquid::Template.parse(@letter.body)
foo.render(''customers'' => @customers.collect { |c|
c.attributes })
Thanks, Tobias!
kris wrote:> <snip>
>
> If you get the solution please post back to the forum and/or liquid docs
> (if you can)...
>
> Steve Koppelman wrote:
>> I''ve got Liquid installed and maybe since I''m not
coming in with Django
>> experience, I''m completely mystified by how to pass anything
worthwhile
>> to a template.
>>
>> In my controller:
>>
>> def preview
>> @customer = Customer.find(1)
>> @letter = Letter.find(1)
>> @liquid_body = Liquid::Template.parse(@letter.body)
>> @x = @liquid_body.render(''fname'' =>
@customer.fname, ''customer'' =>
>> @customer)
>> @draft = render_to_string(:inline => @x)
>> end
>>
>> In the view:
>>
>> <%= draft -%>
>>
>> In my template stored in the DB:
>>
>> Name: {{ fname }}<br/>
>> Weclome {{ customer.fname }}.
>>
>> The result:
>>
>> {{ fname }} returns the value. {{ customer.fname }} comes up empty.
>>
>> I''ve tried a few variations -- local vs. instance variables,
mostly.
>> Surely I don''t have to manually assign an explicit hash every
time I
>> want to pass the attributes of an AR record object to Liquid?
>>
>> Obviously I''m doing something fundamentally wrong.
Unfortunately, the
>> Liquid docs and Wiki only document what goes in the template when
>> dealing with an object or set of objects, not what goes in the
>> controller. The examples are full of constructs like {{
>> product.description }} and {% for product in products %} but not a word
>> about how @products or products are passed in.
>>
>> Can someone help out with a snippet that demonstrates how to get an
>> object complete with attributes into Liquid?
--
Posted via http://www.ruby-forum.com/.