aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2008-08-06 15:23:39 -0700
committerJeremy Kemper <jeremy@bitsweat.net>2008-08-06 15:23:57 -0700
commit165120a606577dd81fe1a267899c4415fe25f1fb (patch)
treecdcd61e795243f57bf1fe82017ef6b94bae6850d /actionpack
parentfbc6129acd9ecb6b7435931b472d3226985ba4c4 (diff)
downloadrails-165120a606577dd81fe1a267899c4415fe25f1fb.tar.gz
rails-165120a606577dd81fe1a267899c4415fe25f1fb.tar.bz2
rails-165120a606577dd81fe1a267899c4415fe25f1fb.zip
Be more careful about deducing action_methods
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/lib/action_controller/base.rb16
1 files changed, 10 insertions, 6 deletions
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb
index c50e255c98..0fdbcbd26f 100644
--- a/actionpack/lib/action_controller/base.rb
+++ b/actionpack/lib/action_controller/base.rb
@@ -428,11 +428,7 @@ module ActionController #:nodoc:
# By default, all methods defined in ActionController::Base and included modules are hidden.
# More methods can be hidden using <tt>hide_actions</tt>.
def hidden_actions
- unless read_inheritable_attribute(:hidden_actions)
- write_inheritable_attribute(:hidden_actions, ActionController::Base.public_instance_methods.map { |m| m.to_s })
- end
-
- read_inheritable_attribute(:hidden_actions)
+ read_inheritable_attribute(:hidden_actions) || write_inheritable_attribute(:hidden_actions, [])
end
# Hide each of the given methods from being callable as actions.
@@ -1234,7 +1230,15 @@ module ActionController #:nodoc:
end
def self.action_methods
- @action_methods ||= Set.new(public_instance_methods.map { |m| m.to_s }) - hidden_actions + public_instance_methods(false).map { |m| m.to_s }
+ @action_methods ||=
+ # 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
+ Base.public_instance_methods(true).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
end
def add_variables_to_assigns