1
0
Fork 0
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:
Yehuda Katz + Carl Lerche 2009-05-15 15:57:12 -07:00
parent eb021707f5
commit 7e10504bde
5 changed files with 39 additions and 33 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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