Class: ActionView::Template

Inherits:
Object
  • Object
show all
Extended by:
Handlers, ActiveSupport::Autoload
Defined in:
lib/action_view/template.rb,
lib/action_view/template/text.rb,
lib/action_view/template/error.rb,
lib/action_view/template/handler.rb,
lib/action_view/template/handlers.rb,
lib/action_view/template/handlers/erb.rb

Overview

Action View Template Handlers

Defined Under Namespace

Modules: Handlers Classes: Error, Handler, Text

Constant Summary collapse

Finalizer =

This finalizer is needed (and exactly with a proc inside another proc) otherwise templates leak in development.

proc do |method_name, mod|
  proc do
    mod.module_eval do
      remove_possible_method method_name
    end
  end
end

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Handlers

extended, extensions, handler_class_for_extension, handler_for_extension, register_default_template_handler, register_template_handler, registered_template_handler, template_handler_extensions

Constructor Details

#initialize(source, identifier, handler, details) ⇒ Template

Returns a new instance of Template.



142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/action_view/template.rb', line 142

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

Instance Attribute Details

#formatsObject

Returns the value of attribute formats.



128
129
130
# File 'lib/action_view/template.rb', line 128

def formats
  @formats
end

#handlerObject (readonly)

Returns the value of attribute handler.



130
131
132
# File 'lib/action_view/template.rb', line 130

def handler
  @handler
end

#identifierObject (readonly)

Returns the value of attribute identifier.



130
131
132
# File 'lib/action_view/template.rb', line 130

def identifier
  @identifier
end

#localsObject

Returns the value of attribute locals.



128
129
130
# File 'lib/action_view/template.rb', line 128

def locals
  @locals
end

#original_encodingObject (readonly)

Returns the value of attribute original_encoding.



130
131
132
# File 'lib/action_view/template.rb', line 130

def original_encoding
  @original_encoding
end

#sourceObject (readonly)

Returns the value of attribute source.



130
131
132
# File 'lib/action_view/template.rb', line 130

def source
  @source
end

#updated_atObject (readonly)

Returns the value of attribute updated_at.



130
131
132
# File 'lib/action_view/template.rb', line 130

def updated_at
  @updated_at
end

#virtual_pathObject

Returns the value of attribute virtual_path.



128
129
130
# File 'lib/action_view/template.rb', line 128

def virtual_path
  @virtual_path
end

Instance Method Details

#inspectObject



200
201
202
# File 'lib/action_view/template.rb', line 200

def inspect
  @inspect ||= defined?(Rails.root) ? identifier.sub("#{Rails.root}/", '') : identifier
end

#mime_typeObject



177
178
179
# File 'lib/action_view/template.rb', line 177

def mime_type
  @mime_type ||= Mime::Type.lookup_by_extension(@formats.first.to_s) if @formats.first
end

#refresh(view) ⇒ Object

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).



189
190
191
192
193
194
195
196
197
198
# File 'lib/action_view/template.rb', line 189

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(view, locals, buffer = nil, &block) ⇒ Object

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.



168
169
170
171
172
173
174
175
# File 'lib/action_view/template.rb', line 168

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

#supports_streaming?Boolean

Returns if the underlying handler supports streaming. If so, a streaming buffer may be passed when it start rendering.

Returns:

  • (Boolean)


158
159
160
# File 'lib/action_view/template.rb', line 158

def supports_streaming?
  handler.respond_to?(:supports_streaming?) && handler.supports_streaming?
end