class Mustache::Rails < Mustache
include ActionController::UrlWriter
include ActionView::Helpers
attr_accessor :request, :response, :params
def initialize(args={})
self.template_file = args[:template_file]
self.request = args[:request]
self.response = args[:response]
self.params = args[:params]
# load instance variables from controller context
importable_instance_variables = response.template.instance_variables.select{|v| v !~ /@(template|_).*/}
importable_instance_variables -= response.template.class.new.instance_variables
importable_instance_variables -= instance_variables
importable_instance_variables.each do |v|
instance_variable_set(v.to_sym, response.template.instance_eval(v))
end
end
end
class Mustache::Rails::TemplateHandler < ActionView::TemplateHandler
def render(template, local_assigns)
mustache_class = Class.new(Mustache::Rails)
helper_class_name = @view.controller.class.to_s.gsub("Controller", "Helper")
if Object.const_defined?(helper_class_name)
mustache_class.send(:include, helper_class_name.constantize)
end
result = mustache_class.new(
:template_file => "#{RAILS_ROOT}/app/views/#{template.path}",
:request => @view.controller.request,
:response => @view.controller.response,
:params => @view.controller.params
)
result.to_html
end
end
ActionView::Template.register_template_handler(:mustache, Mustache::Rails::TemplateHandler)