mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Eliminate internal render stack since we only need its head and tail
This commit is contained in:
parent
9230678104
commit
c8c2b3820e
2 changed files with 26 additions and 16 deletions
|
@ -221,10 +221,12 @@ module ActionView #:nodoc:
|
|||
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
|
||||
|
||||
@_first_template = nil
|
||||
@_current_template = nil
|
||||
end
|
||||
|
||||
attr_reader :view_paths
|
||||
|
@ -286,7 +288,19 @@ module ActionView #:nodoc:
|
|||
# Access the current template being rendered.
|
||||
# Returns a ActionView::Template object.
|
||||
def template
|
||||
@_render_stack.last
|
||||
@_current_template
|
||||
end
|
||||
|
||||
def template=(template) #:nodoc:
|
||||
@_first_template ||= template
|
||||
@_current_template = template
|
||||
end
|
||||
|
||||
def with_template(current_template)
|
||||
last_template, self.template = template, current_template
|
||||
yield
|
||||
ensure
|
||||
self.template = last_template
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -27,23 +27,19 @@ module ActionView
|
|||
def render(view, local_assigns = {})
|
||||
compile(local_assigns)
|
||||
|
||||
stack = view.instance_variable_get(:@_render_stack)
|
||||
stack.push(self)
|
||||
view.with_template self do
|
||||
view.send(:_evaluate_assigns_and_ivars)
|
||||
view.send(:_set_controller_content_type, mime_type) if respond_to?(:mime_type)
|
||||
|
||||
view.send(:_evaluate_assigns_and_ivars)
|
||||
view.send(:_set_controller_content_type, mime_type) if respond_to?(:mime_type)
|
||||
|
||||
result = view.send(method_name(local_assigns), local_assigns) do |*names|
|
||||
ivar = :@_proc_for_layout
|
||||
if !view.instance_variable_defined?(:"@content_for_#{names.first}") && view.instance_variable_defined?(ivar) && (proc = view.instance_variable_get(ivar))
|
||||
view.capture(*names, &proc)
|
||||
elsif view.instance_variable_defined?(ivar = :"@content_for_#{names.first || :layout}")
|
||||
view.instance_variable_get(ivar)
|
||||
view.send(method_name(local_assigns), local_assigns) do |*names|
|
||||
ivar = :@_proc_for_layout
|
||||
if !view.instance_variable_defined?(:"@content_for_#{names.first}") && view.instance_variable_defined?(ivar) && (proc = view.instance_variable_get(ivar))
|
||||
view.capture(*names, &proc)
|
||||
elsif view.instance_variable_defined?(ivar = :"@content_for_#{names.first || :layout}")
|
||||
view.instance_variable_get(ivar)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
stack.pop
|
||||
result
|
||||
end
|
||||
|
||||
def method_name(local_assigns)
|
||||
|
|
Loading…
Reference in a new issue