Finalizer | = | proc do |method_name, mod| proc do mod.module_eval do remove_possible_method method_name end end end |
This finalizer is needed (and exactly with a proc inside another proc) otherwise templates leak in development. |
[RW] | locals | |
[RW] | formats | |
[RW] | virtual_path | |
[R] | source | |
[R] | identifier | |
[R] | handler | |
[R] | original_encoding | |
[R] | updated_at |
# File actionpack/lib/action_view/template.rb, line 115 def initialize(source, identifier, handler, details) format = details[:format] || (handler.default_format if handler.respond_to?(:default_format)) @source = source @identifier = identifier @handler = handler @compiled = false @original_encoding = nil @locals = details[:locals] || [] @virtual_path = details[:virtual_path] @updated_at = details[:updated_at] || Time.now @formats = Array.wrap(format).map { |f| f.is_a?(Mime::Type) ? f.ref : f } end
Receives a view object and return a template similar to self by using @virtual_path.
This method is useful if you have a template object but it does not contain its source anymore since it was already compiled. In such cases, all you need to do is to call refresh passing in the view object.
Notice this method raises an error if the template to be refreshed does not have a virtual path set (true just for inline templates).
# File actionpack/lib/action_view/template.rb, line 162 def refresh(view) raise "A template needs to have a virtual path in order to be refreshed" unless @virtual_path lookup = view.lookup_context pieces = @virtual_path.split("/") name = pieces.pop partial = !!name.sub!(/^_/, "") lookup.disable_cache do lookup.find_template(name, [ pieces.join('/') ], partial, @locals) end end
Render a template. If the template was not compiled yet, it is done exactly before rendering.
This method is instrumented as “!render_template.action_view”. Notice that we use a bang in this instrumentation because you don’t want to consume this in production. This is only slow if it’s being listened to.
# File actionpack/lib/action_view/template.rb, line 141 def render(view, locals, buffer=nil, &block) ActiveSupport::Notifications.instrument("!render_template.action_view", :virtual_path => @virtual_path) do compile!(view) view.send(method_name, locals, buffer, &block) end rescue Exception => e handle_render_error(view, e) end
Returns if the underlying handler supports streaming. If so, a streaming buffer may be passed when it start rendering.