## Handlebars.rb [](http://badge.fury.io/rb/handlebars) [](https://travis-ci.org/cowboyd/handlebars.rb) [](https://gemnasium.com/cowboyd/handlebars.rb) This uses [therubyracer][1] to bind to the _actual_ JavaScript implementation of [Handlebars.js][2] so that you can use it from ruby. ## Usage ### Simple stuff require 'handlebars' handlebars = Handlebars::Context.new template = handlebars.compile("{{say}} {{what}}") template.call(:say => "Hey", :what => "Yuh!") #=> "Hey Yuh!" ### functions as properties template.call(:say => "Hey ", :what => lambda {|this| ("yo" * 2) + "!"}) #=> "Hey yoyo!" ### Block Helpers: 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! ### Safe Strings 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("
Totally Safe!")}) ### Partials 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 ## Test rspec spec/ [1]: http://github.com/cowboyd/therubyracer "The Ruby Racer" [2]: http://github.com/wycats/handlebars.js "Handlebars JavaScript templating library"