aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/base.rb
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2006-02-09 20:05:11 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2006-02-09 20:05:11 +0000
commit76540822609415dc5cfa8ea31bfafea602373a27 (patch)
tree962efec0474b2b30f2edded13b2d95e93e68f603 /actionpack/lib/action_controller/base.rb
parent3a38c829e0790a4341dcb5784118731361f6c788 (diff)
downloadrails-76540822609415dc5cfa8ea31bfafea602373a27.tar.gz
rails-76540822609415dc5cfa8ea31bfafea602373a27.tar.bz2
rails-76540822609415dc5cfa8ea31bfafea602373a27.zip
Major components cleanup and speedup. Closes #3527.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3563 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionpack/lib/action_controller/base.rb')
-rwxr-xr-xactionpack/lib/action_controller/base.rb46
1 files changed, 35 insertions, 11 deletions
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb
index a3f6a0326f..b92dd1ca4e 100755
--- a/actionpack/lib/action_controller/base.rb
+++ b/actionpack/lib/action_controller/base.rb
@@ -305,8 +305,8 @@ module ActionController #:nodoc:
class << self
# Factory for the standard create, process loop where the controller is discarded after processing.
- def process(request, response) #:nodoc:
- new.process(request, response)
+ def process(request, response, parent_controller=nil) #:nodoc:
+ new(parent_controller).process(request, response)
end
# Converts the class name from something like "OneModule::TwoModule::NeatController" to "NeatController".
@@ -359,20 +359,43 @@ module ActionController #:nodoc:
end
end
- public
+ public
+ # If this controller was instantiated to process a component request,
+ # +parent_controller+ points to the instantiator of this controller.
+ attr_reader :parent_controller
+
+ # Create a new controller instance.
+ def initialize(parent_controller=nil) #:nodoc:
+ @parent_controller = parent_controller
+ end
+
# Extracts the action_name from the request parameters and performs that action.
def process(request, response, method = :perform_action, *arguments) #:nodoc:
initialize_template_class(response)
assign_shortcuts(request, response)
+
+ my_flash = flash # calling flash creates @flash
+ if my_parent = @parent_controller
+ # only discard flash if this controller isn't a component request controller
+ my_flash.discard
+ end
+
initialize_current_url
@action_name = params['action'] || 'index'
@variables_added = nil
+ @before_filter_chain_aborted = false
log_processing if logger
send(method, *arguments)
@response
ensure
- close_session
+ unless my_parent
+ unless @before_filter_chain_aborted
+ my_flash.sweep
+ clear_persistent_model_associations
+ end
+ close_session
+ end
end
# Returns a URL that has been rewritten according to the options hash and the defined Routes.
@@ -784,7 +807,7 @@ module ActionController #:nodoc:
case options
when %r{^\w+://.*}
raise DoubleRenderError if performed?
- logger.info("Redirected to #{options}") unless logger.nil?
+ logger.info("Redirected to #{options}") if logger
response.redirect(options)
response.redirected_to = options
@performed_redirect = true
@@ -866,7 +889,8 @@ module ActionController #:nodoc:
@session = @response.session
@template = @response.template
- @assigns = @response.template.assigns
+ @assigns = @response.template.assigns
+
@headers = @response.headers
end
@@ -929,23 +953,23 @@ module ActionController #:nodoc:
if view_controller_internals
[ "@assigns", "@performed_redirect", "@performed_render" ]
else
- [ "@assigns", "@performed_redirect", "@performed_render", "@request", "@response", "@session", "@cookies", "@template" ]
+ [ "@assigns", "@performed_redirect", "@performed_render", "@request", "@response", "@session", "@cookies", "@template", "@request_origin", "@parent_controller" ]
end
end
-
def request_origin
- "#{@request.remote_ip} at #{Time.now.to_s(:db)}"
+ # this *needs* to be cached!
+ # otherwise you'd get different results if calling it more than once
+ @request_origin ||= "#{@request.remote_ip} at #{Time.now.to_s(:db)}"
end
def complete_request_uri
- request.protocol + request.host + request.request_uri
+ "#{@request.protocol}#{@request.host}#{@request.request_uri}"
end
def close_session
@session.close unless @session.nil? || Hash === @session
end
-
def template_exists?(template_name = default_template_name)
@template.file_exists?(template_name)