diff options
author | Jon Leighton <j@jonathanleighton.com> | 2011-09-12 23:58:20 +0100 |
---|---|---|
committer | Jon Leighton <j@jonathanleighton.com> | 2011-09-13 00:02:33 +0100 |
commit | c89e1c7bdefa2489f6ebd04862a426b7200bf494 (patch) | |
tree | a02cf3ec4e28636ec387af96fc67030b456da8c8 /activemodel/lib/active_model | |
parent | 6d8dbeca6b0e676145ecdbba38f2fe56b74b4f8f (diff) | |
download | rails-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')
-rw-r--r-- | activemodel/lib/active_model/attribute_methods.rb | 19 |
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+. |