lib/stache/handler.rb in stache-0.1.0 vs lib/stache/handler.rb in stache-0.2.0
- old
+ new
@@ -6,58 +6,63 @@
# To avoid messy logic figuring this out, we just inherit from whatever the ERB handler does.
class Handler < Stache::Util.av_template_class(:Handlers)::ERB.superclass
if Stache::Util.needs_compilable?
include Stache::Util.av_template_class(:Handlers)::Compilable
end
-
+
# Thanks to Mustache::Rails3 for getting us most of the way home here
def compile(template)
#
# get a custom Mustache, or the default Stache::View
mustache_class = mustache_class_from_template(template)
-
+
# Return a string that will be eval'd in the context of the ActionView, ugly, but it works.
<<-MUSTACHE
mustache = ::#{mustache_class}.new
mustache.view = self
mustache.template = '#{template.source.gsub(/'/, "\\\\'")}'
mustache.virtual_path = '#{template.virtual_path.to_s}'
mustache[:yield] = content_for(:layout)
mustache.context.update(local_assigns)
variables = controller.instance_variable_names
variables -= %w[@template]
-
+
if controller.respond_to?(:protected_instance_variables)
variables -= controller.protected_instance_variables
end
-
+
variables.each do |name|
mustache.instance_variable_set(name, controller.instance_variable_get(name))
end
-
+
# Declaring an +attr_reader+ for each instance variable in the
# Stache::View subclass makes them available to your templates.
mustache.class.class_eval do
attr_reader *variables.map { |name| name.sub(/^@/, '').to_sym }
end
mustache.render.html_safe
MUSTACHE
end
-
+
# In Rails 3.1+, #call takes the place of #compile
def self.call(template)
new.compile(template)
end
# suss out a constant name for the given template
def mustache_class_from_template(template)
const_name = ActiveSupport::Inflector.camelize(template.virtual_path.to_s)
begin
const_name.constantize
- rescue NameError, LoadError
- Stache::View
+ rescue NameError, LoadError => e
+ # Only rescue NameError/LoadError concerning our mustache_class
+ if e.message.match(/#{const_name}$/)
+ Stache::View
+ else
+ raise e
+ end
end
end
end
-end
\ No newline at end of file
+end