aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/lib/active_model/attribute_methods.rb
diff options
context:
space:
mode:
authorJon Leighton <j@jonathanleighton.com>2011-09-12 23:58:20 +0100
committerJon Leighton <j@jonathanleighton.com>2011-09-13 00:02:33 +0100
commitc89e1c7bdefa2489f6ebd04862a426b7200bf494 (patch)
treea02cf3ec4e28636ec387af96fc67030b456da8c8 /activemodel/lib/active_model/attribute_methods.rb
parent6d8dbeca6b0e676145ecdbba38f2fe56b74b4f8f (diff)
downloadrails-c89e1c7bdefa2489f6ebd04862a426b7200bf494.tar.gz
rails-c89e1c7bdefa2489f6ebd04862a426b7200bf494.tar.bz2
rails-c89e1c7bdefa2489f6ebd04862a426b7200bf494.zip
Add an attribute_missing method to ActiveModel::AttributeMethods.
This can be overloaded by implementors if necessary.
Diffstat (limited to 'activemodel/lib/active_model/attribute_methods.rb')
-rw-r--r--activemodel/lib/active_model/attribute_methods.rb19
1 files changed, 11 insertions, 8 deletions
diff --git a/activemodel/lib/active_model/attribute_methods.rb b/activemodel/lib/active_model/attribute_methods.rb
index 39ece6d3b3..539e0bbdda 100644
--- a/activemodel/lib/active_model/attribute_methods.rb
+++ b/activemodel/lib/active_model/attribute_methods.rb
@@ -362,7 +362,7 @@ module ActiveModel
class AttributeMethodMatcher
attr_reader :prefix, :suffix, :method_missing_target
- AttributeMethodMatch = Struct.new(:target, :attr_name)
+ AttributeMethodMatch = Struct.new(:target, :attr_name, :method_name)
def initialize(options = {})
options.symbolize_keys!
@@ -384,7 +384,7 @@ module ActiveModel
def match(method_name)
if @regex =~ method_name
- AttributeMethodMatch.new(method_missing_target, $2)
+ AttributeMethodMatch.new(method_missing_target, $2, method_name)
else
nil
end
@@ -416,15 +416,18 @@ module ActiveModel
super
else
match = match_attribute_method?(method.to_s)
-
- if match
- __send__(match.target, match.attr_name, *args, &block)
- else
- super
- end
+ match ? attribute_missing(match, *args, &block) : super
end
end
+ # attribute_missing is like method_missing, but for attributes. When method_missing is
+ # called we check to see if there is a matching attribute method. If so, we call
+ # attribute_missing to dispatch the attribute. This method can be overloaded to
+ # customise the behaviour.
+ def attribute_missing(match, *args, &block)
+ __send__(match.target, match.attr_name, *args, &block)
+ end
+
# A Person object with a name attribute can ask <tt>person.respond_to?(:name)</tt>,
# <tt>person.respond_to?(:name=)</tt>, and <tt>person.respond_to?(:name?)</tt>
# which will all return +true+.