Skip to content

Instantly share code, notes, and snippets.

@wycats
Created December 5, 2010 18:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wycats/729299 to your computer and use it in GitHub Desktop.
Save wycats/729299 to your computer and use it in GitHub Desktop.
class WelcomeController < ApplicationController
def index
@foo = "FROM CONTROLLER"
@user = User.first
end
end
<h1>Welcome#index</h1>
<p>Find me in app/views/welcome/index.html.erb</p>
<p>{{foo}}</p>
<p>{{{rails "link_to" user/name user}}}</p>
require 'v8'
class HandlebarsTemplateHandler
def self.js
Thread.current[:v8_context] ||= begin
V8::Context.new do |js|
js.load(File.join(Rails.root, 'vendor', 'javascripts', 'handlebars.js'))
js.eval("Templates = {}")
end
end
end
def self.rails_helper
Thread.current[:v8_rails_helper] ||= begin
js.eval(%{
(function(helper) {
var params = Array.prototype.slice.call(arguments, 1);
var av = this.__context__.fallback.actionview;
return av[helper].apply(av, params);
})
})
end
end
def self.call(template)
# Here, we're sticking the compiled template somewhere in V8 where
# we can get back to it
js.eval(%{Templates["#{template.identifier}"] = Handlebars.compile(#{template.source.inspect}) })
%{
js = HandlebarsTemplateHandler.js
fallback = { :actionview => self, :rails => ::HandlebarsTemplateHandler.rails_helper }
js.eval("Templates['#{template.identifier}']").call(assigns, fallback)
}
end
end
ActionView::Template.register_template_handler(:hbs, HandlebarsTemplateHandler)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment