Class: ActionView::CompiledTemplates

Inherits:
Module
  • Object
show all
Defined in:
lib/action_view/compiled_templates.rb

Overview

CompiledTemplates modules hold methods that have been compiled. Templates are compiled into these methods so that they do not need to be re-read and re-parsed each request.

Each template may be compiled into one or more methods. Each method accepts a given set of parameters which is used to implement local assigns passing.

To use a compiled template module, create a new instance and include it into the class in which you want the template to be rendered.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeCompiledTemplates

Returns a new instance of CompiledTemplates.



16
17
18
19
20
21
# File 'lib/action_view/compiled_templates.rb', line 16

def initialize
  @method_names = Hash.new do |hash, key|
    hash[key] = "__compiled_method_#{(hash.length + 1)}"
  end
  @mtimes = {}
end

Instance Attribute Details

#method_namesObject (readonly)

:nodoc:



14
15
16
# File 'lib/action_view/compiled_templates.rb', line 14

def method_names
  @method_names
end

Instance Method Details

#compile_source(identifier, arg_names, source, initial_line_number = 0, file_name = nil) ⇒ Object

Compile the provided source code for the given argument names and with the given initial line number. The identifier should be unique to this source.

The file_name, if provided will appear in backtraces. If not provded, the file_name defaults to the identifier.

This method will return the selector for the compiled version of this method.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/action_view/compiled_templates.rb', line 47

def compile_source(identifier, arg_names, source, initial_line_number = 0, file_name = nil)
  file_name ||= identifier
  name = method_names[full_key(identifier, arg_names)]
  arg_desc = arg_names.empty? ? '' : "(#{arg_names * ', '})"
  fake_file_name = "#{file_name}#{arg_desc}" # Include the arguments for this version (for now)
  
  method_def = wrap_source(name, arg_names, source)
  
  begin
    module_eval(method_def, fake_file_name, initial_line_number)
    @mtimes[full_key(identifier, arg_names)] = Time.now
  rescue Exception => e  # errors from compiled source
    e.blame_file! identifier
    raise
  end
  name
end

#full_key(identifier, arg_names) ⇒ Object

Return the full key for the given identifier and argument names



24
25
26
# File 'lib/action_view/compiled_templates.rb', line 24

def full_key(identifier, arg_names)
  [identifier, arg_names]
end

#mtime(identifier, arg_names) ⇒ Object

Return the time at which the method for the given identifier and argument names was compiled.



36
37
38
# File 'lib/action_view/compiled_templates.rb', line 36

def mtime(identifier, arg_names)
  @mtimes[full_key(identifier, arg_names)]
end

#selector(identifier, arg_names) ⇒ Object Also known as: compiled?

Return the selector for this method or nil if it has not been compiled



29
30
31
32
# File 'lib/action_view/compiled_templates.rb', line 29

def selector(identifier, arg_names)
  key = full_key(identifier, arg_names)
  method_names.key?(key) ? method_names[key] : nil
end

#wrap_source(name, arg_names, source) ⇒ Object

Wrap the provided source in a def … end block.



66
67
68
# File 'lib/action_view/compiled_templates.rb', line 66

def wrap_source(name, arg_names, source)
  "def #{name}(#{arg_names * ', '})\n#{source}\nend"
end