提交 ac50ee0e 编写于 作者: J Joshua Peek

Track rendered templates in stack so the current template can always be...

Track rendered templates in stack so the current template can always be accessed. Added ActionView::Base#template to access the template object.
上级 0f651aec
......@@ -218,7 +218,7 @@ def redirect_url_match?( pattern )
# Returns the template of the file which was used to
# render this response (or nil)
def rendered_template
template.send(:_first_render)
template.instance_variable_get(:@_first_render)
end
# A shortcut to the flash. Returns an empty hash if no session flash exists.
......
......@@ -222,6 +222,7 @@ def include(*args)
def initialize(view_paths = [], assigns_for_first_render = {}, controller = nil)#:nodoc:
@assigns = assigns_for_first_render
@assigns_added = nil
@_render_stack = []
@controller = controller
@helpers = ProxyModule.new(self)
self.view_paths = view_paths
......@@ -271,9 +272,13 @@ def template_format
end
end
private
attr_accessor :_first_render, :_last_render
# Access the current template being rendered.
# Returns a ActionView::Template object.
def template
@_render_stack.last
end
private
# Evaluates the local assigns and controller ivars, pushes them to the view.
def _evaluate_assigns_and_ivars #:nodoc:
unless @assigns_added
......@@ -312,7 +317,7 @@ def _pick_template(template_path)
template
elsif template = self.view_paths[template_file_name]
template
elsif _first_render && template = self.view_paths["#{template_file_name}.#{_first_render.format_and_extension}"]
elsif @_render_stack.first && template = self.view_paths["#{template_file_name}.#{@_render_stack.first.format_and_extension}"]
template
elsif template_format == :js && template = self.view_paths["#{template_file_name}.html"]
@template_format = :html
......
......@@ -25,13 +25,16 @@ def compiled_source
def render(view, local_assigns = {})
compile(local_assigns)
view.send(:_first_render=, self) unless view.send(:_first_render)
view.send(:_last_render=, self)
stack = view.instance_variable_get(:@_render_stack)
stack.push(self)
# This is only used for TestResponse to set rendered_template
view.instance_variable_set(:@_first_render, self) unless view.instance_variable_get(:@_first_render)
view.send(:_evaluate_assigns_and_ivars)
view.send(:_set_controller_content_type, mime_type) if respond_to?(:mime_type)
view.send(method_name(local_assigns), local_assigns) do |*names|
result = view.send(method_name(local_assigns), local_assigns) do |*names|
ivar = :@_proc_for_layout
if view.instance_variable_defined?(ivar) and proc = view.instance_variable_get(ivar)
view.capture(*names, &proc)
......@@ -39,6 +42,9 @@ def render(view, local_assigns = {})
view.instance_variable_get(ivar)
end
end
stack.pop
result
end
def method_name(local_assigns)
......
<%= template.path %>
\ No newline at end of file
......@@ -41,6 +41,10 @@ def test_render_file_not_using_full_path_with_dot_in_path
assert_equal "The secret is in the sauce\n", @view.render("test/dot.directory/render_file_with_ivar")
end
def test_render_has_access_current_template
assert_equal "test/template.erb", @view.render("test/template.erb")
end
def test_render_update
# TODO: You should not have to stub out template because template is self!
@view.instance_variable_set(:@template, @view)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册