Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Move copying ivar logic from ActionController::Base to ActionView::Base

  • Loading branch information...
commit a59a3db1f3ae8c6aadaa8e1ce08b05f9ad677932 1 parent 6183e55
@lifo lifo authored
View
37 actionpack/lib/action_controller/base.rb
@@ -260,10 +260,11 @@ class Base
include StatusCodes
+ cattr_reader :protected_instance_variables
# Controller specific instance variables which will not be accessible inside views.
- @@protected_view_variables = %w(@assigns @performed_redirect @performed_render @variables_added @request_origin @url @parent_controller
- @action_name @before_filter_chain_aborted @action_cache_path @_session @_cookies @_headers @_params
- @_flash @_response)
+ @@protected_instance_variables = %w(@assigns @performed_redirect @performed_render @variables_added @request_origin @url @parent_controller
+ @action_name @before_filter_chain_aborted @action_cache_path @_session @_cookies @_headers @_params
+ @_flash @_response)
# Prepends all the URL-generating helpers from AssetHelper. This makes it possible to easily move javascripts, stylesheets,
# and images to a dedicated asset server away from the main web server. Example:
@@ -393,10 +394,6 @@ def self.relative_url_root
# directive. Values should always be specified as strings.
attr_internal :headers
- # Holds the hash of variables that are passed on to the template class to be made available to the view. This hash
- # is generated by taking a snapshot of all the instance variables in the current scope just before a template is rendered.
- attr_accessor :assigns
-
# Returns the name of the action this controller is processing.
attr_accessor :action_name
@@ -538,7 +535,6 @@ def process(request, response, method = :perform_action, *arguments) #:nodoc:
assign_shortcuts(request, response)
initialize_current_url
assign_names
- forget_variables_added_to_assigns
log_processing
@@ -893,7 +889,6 @@ def render(options = nil, extra_options = {}, &block) #:doc:
render_for_file(template, options[:status], options[:locals] || {})
elsif inline = options[:inline]
- add_variables_to_assigns
render_for_text(@template.render(options), options[:status])
elsif action_name = options[:action]
@@ -911,12 +906,10 @@ def render(options = nil, extra_options = {}, &block) #:doc:
elsif options[:partial]
options[:partial] = default_template_name if options[:partial] == true
- add_variables_to_assigns
render_for_text(@template.render(options), options[:status])
elsif options[:update]
- add_variables_to_assigns
- @template.send! :evaluate_assigns
+ @template.send! :evaluate_assigns_and_ivars
generator = ActionView::Helpers::PrototypeHelper::JavaScriptGenerator.new(@template, &block)
response.content_type = Mime::JS
@@ -937,7 +930,6 @@ def render_to_string(options = nil, &block) #:doc:
render(options, &block)
ensure
erase_render_results
- forget_variables_added_to_assigns
reset_variables_added_to_assigns
end
@@ -1123,7 +1115,6 @@ def reset_session #:doc:
private
def render_for_file(template_path, status = nil, locals = {}) #:nodoc:
- add_variables_to_assigns
logger.info("Rendering #{template_path}" + (status ? " (#{status})" : '')) if logger
render_for_text(@template.render(:file => template_path, :locals => locals), status)
end
@@ -1160,7 +1151,6 @@ def assign_shortcuts(request, response)
@_session = @_response.session
@template = @_response.template
- @assigns = @_response.template.assigns
@_headers = @_response.headers
end
@@ -1224,27 +1214,10 @@ def self.action_methods
hidden_actions
end
- def add_variables_to_assigns
- unless @variables_added
- add_instance_variables_to_assigns
- @variables_added = true
- end
- end
-
- def forget_variables_added_to_assigns
- @variables_added = nil
- end
-
def reset_variables_added_to_assigns
@template.instance_variable_set("@assigns_added", nil)
end
- def add_instance_variables_to_assigns
- (instance_variable_names - @@protected_view_variables).each do |var|
- @assigns[var[1..-1]] = instance_variable_get(var)
- end
- end
-
def request_origin
# this *needs* to be cached!
# otherwise you'd get different results if calling it more than once
View
1  actionpack/lib/action_controller/layout.rb
@@ -250,7 +250,6 @@ def render_with_a_layout(options = nil, extra_options = {}, &block) #:nodoc:
content_for_layout = render_with_no_layout(options, extra_options, &block)
erase_render_results
- add_variables_to_assigns
@template.instance_variable_set("@content_for_layout", content_for_layout)
response.layout = layout
status = template_with_options ? options[:status] : nil
View
3  actionpack/lib/action_controller/rescue.rb
@@ -177,11 +177,8 @@ def local_request? #:doc:
# Render detailed diagnostics for unhandled exceptions rescued from
# a controller action.
def rescue_action_locally(exception)
- add_variables_to_assigns
@template.instance_variable_set("@exception", exception)
@template.instance_variable_set("@rescues_path", File.dirname(rescues_path("stub")))
- @template.send!(:assign_variables_from_controller)
-
@template.instance_variable_set("@contents", @template.render(:file => template_path_for_local_rescue(exception)))
response.content_type = Mime::HTML
View
9 actionpack/lib/action_controller/test_process.rb
@@ -3,6 +3,8 @@
module ActionController #:nodoc:
class Base
+ attr_reader :assigns
+
# Process a test request called with a TestRequest object.
def self.process_test(request)
new.process_test(request)
@@ -14,7 +16,12 @@ def process_test(request) #:nodoc:
def process_with_test(*args)
returning process_without_test(*args) do
- add_variables_to_assigns
+ @assigns = {}
+ (instance_variable_names - @@protected_instance_variables).each do |var|
+ value = instance_variable_get(var)
+ @assigns[var[1..-1]] = value
+ response.template.assigns[var[1..-1]] = value if response
+ end
end
end
View
16 actionpack/lib/action_view/base.rb
@@ -343,18 +343,20 @@ def pick_template(template_path)
private
# Evaluate the local assigns and pushes them to the view.
- def evaluate_assigns
+ def evaluate_assigns_and_ivars
unless @assigns_added
- assign_variables_from_controller
+ @assigns.each { |key, value| instance_variable_set("@#{key}", value) }
+
+ if @controller
+ variables = @controller.instance_variables
+ variables -= @controller.protected_instance_variables if @controller.respond_to?(:protected_instance_variables)
+ variables.each {|name| instance_variable_set(name, @controller.instance_variable_get(name)) }
+ end
+
@assigns_added = true
end
end
- # Assigns instance variables from the controller to the view.
- def assign_variables_from_controller
- @assigns.each { |key, value| instance_variable_set("@#{key}", value) }
- end
-
def set_controller_content_type(content_type)
if controller.respond_to?(:response)
controller.response.content_type ||= content_type
View
2  actionpack/lib/action_view/renderable.rb
@@ -29,7 +29,7 @@ def render(view, local_assigns = {})
view._first_render ||= self
view._last_render = self
- view.send(:evaluate_assigns)
+ 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|
View
24 actionpack/test/controller/filters_test.rb
@@ -111,15 +111,15 @@ class BeforeAndAfterConditionController < ConditionalFilterController
end
class OnlyConditionProcController < ConditionalFilterController
- before_filter(:only => :show) {|c| c.assigns["ran_proc_filter"] = true }
+ before_filter(:only => :show) {|c| c.instance_variable_set(:"@ran_proc_filter", true) }
end
class ExceptConditionProcController < ConditionalFilterController
- before_filter(:except => :show_without_filter) {|c| c.assigns["ran_proc_filter"] = true }
+ before_filter(:except => :show_without_filter) {|c| c.instance_variable_set(:"@ran_proc_filter", true) }
end
class ConditionalClassFilter
- def self.filter(controller) controller.assigns["ran_class_filter"] = true end
+ def self.filter(controller) controller.instance_variable_set(:"@ran_class_filter", true) end
end
class OnlyConditionClassController < ConditionalFilterController
@@ -131,7 +131,7 @@ class ExceptConditionClassController < ConditionalFilterController
end
class AnomolousYetValidConditionController < ConditionalFilterController
- before_filter(ConditionalClassFilter, :ensure_login, Proc.new {|c| c.assigns["ran_proc_filter1"] = true }, :except => :show_without_filter) { |c| c.assigns["ran_proc_filter2"] = true}
+ before_filter(ConditionalClassFilter, :ensure_login, Proc.new {|c| c.instance_variable_set(:"@ran_proc_filter1", true)}, :except => :show_without_filter) { |c| c.instance_variable_set(:"@ran_proc_filter2", true)}
end
class ConditionalOptionsFilter < ConditionalFilterController
@@ -225,16 +225,16 @@ class AnotherChildOfConditionalParentController < ConditionalParentOfConditional
end
class ProcController < PrependingController
- before_filter(proc { |c| c.assigns["ran_proc_filter"] = true })
+ before_filter(proc { |c| c.instance_variable_set(:"@ran_proc_filter", true) })
end
class ImplicitProcController < PrependingController
- before_filter { |c| c.assigns["ran_proc_filter"] = true }
+ before_filter { |c| c.instance_variable_set(:"@ran_proc_filter", true) }
end
class AuditFilter
def self.filter(controller)
- controller.assigns["was_audited"] = true
+ controller.instance_variable_set(:"@was_audited", true)
end
end
@@ -242,12 +242,12 @@ class AroundFilter
def before(controller)
@execution_log = "before"
controller.class.execution_log << " before aroundfilter " if controller.respond_to? :execution_log
- controller.assigns["before_ran"] = true
+ controller.instance_variable_set(:"@before_ran", true)
end
def after(controller)
- controller.assigns["execution_log"] = @execution_log + " and after"
- controller.assigns["after_ran"] = true
+ controller.instance_variable_set(:"@execution_log", @execution_log + " and after")
+ controller.instance_variable_set(:"@after_ran", true)
controller.class.execution_log << " after aroundfilter " if controller.respond_to? :execution_log
end
end
@@ -726,9 +726,9 @@ def filter(controller)
class ControllerWithProcFilter < PostsController
around_filter(:only => :no_raise) do |c,b|
- c.assigns['before'] = true
+ c.instance_variable_set(:"@before", true)
b.call
- c.assigns['after'] = true
+ c.instance_variable_set(:"@after", true)
end
end
Please sign in to comment.
Something went wrong with that request. Please try again.