Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Refactored AbstractController to provide better hook points for overr…

…iding aspects of action dispatching
  • Loading branch information...
commit 7e10504bdeab14ea70a942110a1b1ef6d8467ed3 1 parent eb02170
Yehuda Katz + Carl Lerche authored
View
27 actionpack/lib/action_controller/abstract/base.rb
@@ -69,14 +69,13 @@ def initialize
end
def process(action_name)
- action_name = action_name.to_s
+ @_action_name = action_name = action_name.to_s
- unless respond_to_action?(action_name)
+ unless action_name = method_for_action(action_name)
raise ActionNotFound, "The action '#{action_name}' could not be found"
end
-
- @_action_name = action_name
- process_action
+
+ process_action(action_name)
self
end
@@ -95,18 +94,22 @@ def action_method?(action)
# is overridden in a subclass. For instance, ActionController::Base
# overrides it to include the case where a template matching the
# action_name is found.
- def process_action
- if action_method?(action_name) then send(action_name)
- elsif respond_to?(:action_missing, true) then action_missing(action_name)
- end
+ def process_action(method_name)
+ send(method_name)
end
-
+
+ def _handle_action_missing
+ action_missing(@_action_name)
+ end
+
# Override this to change the conditions that will raise an
# ActionNotFound error. If you accept a difference case,
# you must handle it by also overriding process_action and
# handling the case.
- def respond_to_action?(action_name)
- action_method?(action_name) || respond_to?(:action_missing, true)
+ def method_for_action(action_name)
+ if action_method?(action_name) then action_name
+ elsif respond_to?(:action_missing, true) then "_handle_action_missing"
+ end
end
end
end
View
4 actionpack/lib/action_controller/abstract/callbacks.rb
@@ -8,8 +8,8 @@ module Callbacks
define_callbacks :process_action, "response_body"
end
- def process_action
- _run_process_action_callbacks(action_name) do
+ def process_action(method_name)
+ _run_process_action_callbacks(method_name) do
super
end
end
View
16 actionpack/lib/action_controller/new_base/base.rb
@@ -114,14 +114,22 @@ def redirect_to(options = {}, response_status = {}) #:doc:
super(url, status)
end
- def process_action
+ def process_action(method_name)
ret = super
render if response_body.nil?
ret
end
-
- def respond_to_action?(action_name)
- super || view_paths.find_by_parts?(action_name.to_s, {:formats => formats, :locales => [I18n.locale]}, controller_path)
+
+ def _implicit_render
+ render
+ end
+
+ def method_for_action(action_name)
+ super || begin
+ if view_paths.find_by_parts?(action_name.to_s, {:formats => formats, :locales => [I18n.locale]}, controller_path)
+ "_implicit_render"
+ end
+ end
end
end
end
View
18 actionpack/lib/action_controller/new_base/compatibility.rb
@@ -69,17 +69,13 @@ def render_to_body(options)
super
end
-
- def respond_to_action?(action_name)
- if respond_to?(:method_missing) && !respond_to?(:action_missing)
- self.class.class_eval do
- private
- def action_missing(name, *args)
- method_missing(name.to_sym, *args)
- end
- end
- end
- super
+
+ def _handle_method_missing
+ method_missing(@_action_name.to_sym)
+ end
+
+ def method_for_action(action_name)
+ super || (respond_to?(:method_missing) && "_handle_method_missing")
end
def _layout_for_name(name)
View
7 actionpack/test/abstract_controller/abstract_controller_test.rb
@@ -201,11 +201,10 @@ def index() self.response_body = "success" end
def fail() self.response_body = "fail" end
private
-
- def respond_to_action?(action_name)
- action_name.to_s != "fail"
+
+ def method_for_action(action_name)
+ action_name.to_s != "fail" && action_name
end
-
end
class TestRespondToAction < ActiveSupport::TestCase
Please sign in to comment.
Something went wrong with that request. Please try again.