This uses therubyracer to bind to the actual JavaScript implementation of Handlebars.js so that you can use it from ruby.
require 'handlebars'
handlebars = Handlebars::Context.new
template = handlebars.compile("{{say}}{{what}}")
template.call(:say => "Hey", :what => "Yuh!") #=> "Hey Yuh!"
template.call(:say => "Hey", :what => lambda {|this| ("yo" * 2) + "!"}) #=> "Hey yoyo!"
Just like JavaScript, you can write block helpers with an {{else}}
section. To print
out a section twice if a condition is met:
handlebars.register_helper(:twice) do |context, condition, block|
if condition
"#{block.fn(context)}#{block.fn(context)}"
else
block.inverse(context)
end
end
template = handlebars.compile({{#twice foo}}Hurray!{{else}}Boo!{{/twice}})
template.call(foo: true) #=> Hurray!Hurray!
template.call(foo: false) #=> Boo!
By default, handlebars will escape strings that are returned by your block helpers. To mark a string as safe:
template = handlebars.compile("{{safe}}")
template.call(:safe => proc {Handlebars::SafeString.new("<pre>Totally Safe!<pre>")})
You can directly register partials
handlebars.register_partial("whoami", " I am {{who}}")
handlebars.compile("{{>whoami}}").call(:who => 'Legend') #=> I am Legend
Partials can also be dynamically looked up by defining a partial_missing behavior:
handlebars.partial_missing do |name|
"unable to find >#{name}"
end
handlebars.compile("{{>missing}}").call #=> unable to find >missing
Missing partials can also be returned as a function:
count = 0
handlebars.partial_missing do |name|
lambda do |this, context, options|
count += 1
"#{count} miss(es) when trying to look up a partial"
end
end
t = handlebars.compile("{{>missing}}")
t.call #=> 1 miss(es) when trying to look up a partial
t.call #=> 2 miss(es) when tyring to look up a partial
git clone [email protected]:cowboyd/handlebars.rb.git #git it
cd handlebars.rb #go to it
git submodule update --init #pull down handlebars.js
rspec spec/ #test it