Class: ActionView::Template

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

Overview

Action View Template Handlers

Defined Under Namespace

Modules: Handlers Classes: Error, Handler, Text

Constant Summary

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

Methods included from ActiveSupport::Autoload

autoload, autoload_at, autoload_under, autoloads, eager_autoload, eager_autoload!

Constructor Details

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



115
116
117
118
119
120
121
122
123
124
125
126
127
# 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

Instance Attribute Details

#formatsObject

Returns the value of attribute formats



101
102
103
# File 'actionpack/lib/action_view/template.rb', line 101

def formats
  @formats
end

#handlerObject (readonly)

Returns the value of attribute handler



103
104
105
# File 'actionpack/lib/action_view/template.rb', line 103

def handler
  @handler
end

#identifierObject (readonly)

Returns the value of attribute identifier



103
104
105
# File 'actionpack/lib/action_view/template.rb', line 103

def identifier
  @identifier
end

#localsObject

Returns the value of attribute locals



101
102
103
# File 'actionpack/lib/action_view/template.rb', line 101

def locals
  @locals
end

#original_encodingObject (readonly)

Returns the value of attribute original_encoding



103
104
105
# File 'actionpack/lib/action_view/template.rb', line 103

def original_encoding
  @original_encoding
end

#sourceObject (readonly)

Returns the value of attribute source



103
104
105
# File 'actionpack/lib/action_view/template.rb', line 103

def source
  @source
end

#updated_atObject (readonly)

Returns the value of attribute updated_at



103
104
105
# File 'actionpack/lib/action_view/template.rb', line 103

def updated_at
  @updated_at
end

#virtual_pathObject

Returns the value of attribute virtual_path



101
102
103
# File 'actionpack/lib/action_view/template.rb', line 101

def virtual_path
  @virtual_path
end

Instance Method Details

#inspectObject



173
174
175
# File 'actionpack/lib/action_view/template.rb', line 173

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

#mime_typeObject



150
151
152
# File 'actionpack/lib/action_view/template.rb', line 150

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



162
163
164
165
166
167
168
169
170
171
# 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(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.



141
142
143
144
145
146
147
148
# 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

#supports_streaming?Boolean

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



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

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