From c29bb8857e637e77a8cf10f10c049d20fea3228a Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 17 Jan 2010 22:06:28 -0600 Subject: [PATCH] Clear out AS callback method pollution in AC::Base.action_methods --- actionpack/lib/abstract_controller/base.rb | 20 +++++++------ .../test/controller/new_base/base_test.rb | 28 ++++++++++++++++++- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/actionpack/lib/abstract_controller/base.rb b/actionpack/lib/abstract_controller/base.rb index 816412d97e80b..3119ee498b2e5 100644 --- a/actionpack/lib/abstract_controller/base.rb +++ b/actionpack/lib/abstract_controller/base.rb @@ -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. diff --git a/actionpack/test/controller/new_base/base_test.rb b/actionpack/test/controller/new_base/base_test.rb index 1f9bf7f0fbae6..964780eaf2384 100644 --- a/actionpack/test/controller/new_base/base_test.rb +++ b/actionpack/test/controller/new_base/base_test.rb @@ -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