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

- (Template) initialize(source, identifier, handler, details)

A new instance of 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(&:to_sym)
end

Instance Attribute Details

- (Object) formats

Returns the value of attribute formats



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

def formats
  @formats
end

- (Object) handler (readonly)

Returns the value of attribute handler



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

def handler
  @handler
end

- (Object) identifier (readonly)

Returns the value of attribute identifier



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

def identifier
  @identifier
end

- (Object) locals

Returns the value of attribute locals



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

def locals
  @locals
end

- (Object) original_encoding (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

- (Object) source (readonly)

Returns the value of attribute source



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

def source
  @source
end

- (Object) updated_at (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

- (Object) virtual_path

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

- (Object) data

Used to store template data by template handlers.



188
189
190
# File 'actionpack/lib/action_view/template.rb', line 188

def data
  @data ||= {}
end

- (Object) expire!

Expires this template by setting his updated_at date to Jan 1st, 1970.



171
172
173
# File 'actionpack/lib/action_view/template.rb', line 171

def expire!
  @updated_at = Time.utc(1970)
end

- (Object) inspect



192
193
194
195
196
197
198
199
# File 'actionpack/lib/action_view/template.rb', line 192

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

- (Object) mime_type



147
148
149
# File 'actionpack/lib/action_view/template.rb', line 147

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

- (Object) refresh(view)

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



159
160
161
162
163
164
165
166
167
168
# File 'actionpack/lib/action_view/template.rb', line 159

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

- (Object) render(view, locals, &block)

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.



135
136
137
138
139
140
141
142
143
144
145
# File 'actionpack/lib/action_view/template.rb', line 135

def render(view, locals, &block)
  old_template, view._template = view._template, self
  ActiveSupport::Notifications.instrument("!render_template.action_view", :virtual_path => @virtual_path) do
    compile!(view)
    view.send(method_name, locals, &block)
  end
rescue Exception => e
  handle_render_error(view, e)
ensure
  view._template = old_template
end

- (Object) rerender(view)

Receives a view context and renders a template exactly like self by using the @virtual_path. It raises an error if no @virtual_path was given.



177
178
179
180
181
182
183
184
185
# File 'actionpack/lib/action_view/template.rb', line 177

def rerender(view)
  raise "A template needs to have a virtual path in order to be rerendered" unless @virtual_path
  name = @virtual_path.dup
  if name.sub!(/(^|\/)_([^\/]*)$/, '\1\2')
    view.render :partial => name
  else
    view.render :template => @virtual_path
  end
end