mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Refactored AbstractController to provide better hook points for overriding aspects of action dispatching
This commit is contained in:
parent
eb021707f5
commit
7e10504bde
5 changed files with 39 additions and 33 deletions
|
@ -69,14 +69,13 @@ module AbstractController
|
|||
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 @@ module AbstractController
|
|||
# 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
|
|
@ -8,8 +8,8 @@ module AbstractController
|
|||
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
|
||||
|
|
|
@ -114,14 +114,22 @@ module ActionController
|
|||
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
|
|
@ -69,17 +69,13 @@ module ActionController
|
|||
|
||||
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)
|
||||
|
|
|
@ -201,11 +201,10 @@ module AbstractController
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue