提交 c29bb885 编写于 作者: J Joshua Peek

Clear out AS callback method pollution in AC::Base.action_methods

上级 58fe3295
......@@ -62,15 +62,19 @@ def hidden_actions
# Array[String]:: A list of all methods that should be considered
# actions.
def action_methods
@action_methods ||=
@action_methods ||= begin
# All public instance methods of this class, including ancestors
public_instance_methods(true).map { |m| m.to_s }.to_set -
# Except for public instance methods of Base and its ancestors
internal_methods.map { |m| m.to_s } +
# Be sure to include shadowed public instance methods of this class
public_instance_methods(false).map { |m| m.to_s } -
# And always exclude explicitly hidden actions
hidden_actions
methods = public_instance_methods(true).map { |m| m.to_s }.to_set -
# Except for public instance methods of Base and its ancestors
internal_methods.map { |m| m.to_s } +
# Be sure to include shadowed public instance methods of this class
public_instance_methods(false).map { |m| m.to_s } -
# And always exclude explicitly hidden actions
hidden_actions
# Clear out AS callback method pollution
methods.reject { |method| method =~ /_one_time_conditions/ }
end
end
# Returns the full controller name, underscored, without the ending Controller.
......
......@@ -3,6 +3,8 @@
# Tests the controller dispatching happy path
module Dispatching
class SimpleController < ActionController::Base
before_filter :authenticate
def index
render :text => "success"
end
......@@ -12,12 +14,20 @@ def modify_response_body
end
def modify_response_body_twice
ret = (self.response_body = "success")
ret = (self.response_body = "success")
self.response_body = "#{ret}!"
end
def modify_response_headers
end
def show_actions
render :text => "actions: #{action_methods.to_a.join(', ')}"
end
protected
def authenticate
end
end
class EmptyController < ActionController::Base ; end
......@@ -64,5 +74,21 @@ class BaseTest < Rack::TestCase
assert_equal 'empty', EmptyController.controller_name
assert_equal 'contained_empty', Submodule::ContainedEmptyController.controller_name
end
test "action methods" do
assert_equal Set.new(%w(
modify_response_headers
modify_response_body_twice
index
modify_response_body
show_actions
)), SimpleController.action_methods
assert_equal Set.new, EmptyController.action_methods
assert_equal Set.new, Submodule::ContainedEmptyController.action_methods
get "/dispatching/simple/show_actions"
assert_body "actions: modify_response_headers, modify_response_body_twice, index, modify_response_body, show_actions"
end
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册