Class: ActionView::TemplateRenderer

Inherits:
AbstractRenderer show all
Defined in:
actionview/lib/action_view/renderer/template_renderer.rb

Overview

:nodoc:

Direct Known Subclasses

StreamingTemplateRenderer

Instance Method Summary collapse

Methods inherited from AbstractRenderer

#initialize

Constructor Details

This class inherits a constructor from ActionView::AbstractRenderer

Instance Method Details

#determine_template(options) ⇒ Object

Determine the template to be rendered using the given options.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'actionview/lib/action_view/renderer/template_renderer.rb', line 21

def determine_template(options) #:nodoc:
  keys = options.fetch(:locals, {}).keys

  if options.key?(:body)
    Template::Text.new(options[:body])
  elsif options.key?(:text)
    Template::Text.new(options[:text], formats.first)
  elsif options.key?(:plain)
    Template::Text.new(options[:plain])
  elsif options.key?(:html)
    Template::HTML.new(options[:html], formats.first)
  elsif options.key?(:file)
    with_fallbacks { find_template(options[:file], nil, false, keys, @details) }
  elsif options.key?(:inline)
    handler = Template.handler_for_extension(options[:type] || "erb")
    Template.new(options[:inline], "inline template", handler, :locals => keys)
  elsif options.key?(:template)
    if options[:template].respond_to?(:render)
      options[:template]
    else
      find_template(options[:template], options[:prefixes], false, keys, @details)
    end
  else
    raise ArgumentError, "You invoked render but did not give any of :partial, :template, :inline, :file, :plain, :text or :body option."
  end
end

#find_layout(layout, keys) ⇒ Object

This is the method which actually finds the layout using details in the lookup context object. If no layout is found, it checks if at least a layout with the given name exists across all details before raising the error.



76
77
78
# File 'actionview/lib/action_view/renderer/template_renderer.rb', line 76

def find_layout(layout, keys)
  with_layout_format { resolve_layout(layout, keys) }
end

#render(context, options) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'actionview/lib/action_view/renderer/template_renderer.rb', line 5

def render(context, options)
  @view    = context
  @details = extract_details(options)
  template = determine_template(options)
  context  = @lookup_context

  prepend_formats(template.formats)

  unless context.rendered_format
    context.rendered_format = template.formats.first || formats.first
  end

  render_template(template, options[:layout], options[:locals])
end

#render_template(template, layout_name = nil, locals = nil) ⇒ Object

Renders the given template. A string representing the layout can be supplied as well.



50
51
52
53
54
55
56
57
58
# File 'actionview/lib/action_view/renderer/template_renderer.rb', line 50

def render_template(template, layout_name = nil, locals = nil) #:nodoc:
  view, locals = @view, locals || {}

  render_with_layout(layout_name, locals) do |layout|
    instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
      template.render(view, locals) { |*name| view._layout_for(*name) }
    end
  end
end

#render_with_layout(path, locals) ⇒ Object

:nodoc:



60
61
62
63
64
65
66
67
68
69
70
71
# File 'actionview/lib/action_view/renderer/template_renderer.rb', line 60

def render_with_layout(path, locals) #:nodoc:
  layout  = path && find_layout(path, locals.keys)
  content = yield(layout)

  if layout
    view = @view
    view.view_flow.set(:layout, content)
    layout.render(view, locals){ |*name| view._layout_for(*name) }
  else
    content
  end
end

#resolve_layout(layout, keys) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'actionview/lib/action_view/renderer/template_renderer.rb', line 80

def resolve_layout(layout, keys)
  case layout
  when String
    begin
      if layout =~ /^\//
        with_fallbacks { find_template(layout, nil, false, keys, @details) }
      else
        find_template(layout, nil, false, keys, @details)
      end
    rescue ActionView::MissingTemplate
      all_details = @details.merge(:formats => @lookup_context.default_formats)
      raise unless template_exists?(layout, nil, false, keys, all_details)
    end
  when Proc
    resolve_layout(layout.call, keys)
  when FalseClass
    nil
  else
    layout
  end
end