From dd664c33b73adef336c78a5db4b67ad6cbbefb9f Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Mon, 31 Jul 2006 06:54:06 +0000 Subject: r4880@ks: jeremy | 2006-07-30 23:52:59 -0700 Only set method_name = md.pre_match if the pre_match is an attribute. Plays nicely with other ? suffixed attribute methods. r4881@ks: jeremy | 2006-07-30 23:53:37 -0700 Heavier testing for attribute method suffixes. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4635 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/lib/active_record/base.rb | 3 ++- activerecord/test/attribute_methods_test.rb | 31 +++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) (limited to 'activerecord') diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 820e6a80ce..e90c65ee07 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1763,7 +1763,8 @@ module ActiveRecord #:nodoc: method_name = method_id.to_s if @attributes.include?(method_name) or (md = /\?$/.match(method_name) and - @attributes.include?(method_name = md.pre_match)) + @attributes.include?(query_method_name = md.pre_match) and + method_name = query_method_name) define_read_methods if self.class.read_methods.empty? && self.class.generate_read_methods md ? query_attribute(method_name) : read_attribute(method_name) elsif self.class.primary_key.to_s == method_name diff --git a/activerecord/test/attribute_methods_test.rb b/activerecord/test/attribute_methods_test.rb index 8dcca2fc4a..0fa13c65ca 100755 --- a/activerecord/test/attribute_methods_test.rb +++ b/activerecord/test/attribute_methods_test.rb @@ -2,14 +2,30 @@ require 'abstract_unit' class AttributeMethodsTest < Test::Unit::TestCase def setup + @old_suffixes = ActiveRecord::Base.send(:attribute_method_suffixes).dup @target = Class.new(ActiveRecord::Base) @target.table_name = 'topics' end + def teardown + ActiveRecord::Base.send(:attribute_method_suffixes).clear + ActiveRecord::Base.attribute_method_suffix *@old_suffixes + end + + def test_match_attribute_method_query_returns_match_data assert_not_nil md = @target.match_attribute_method?('title=') assert_equal 'title', md.pre_match assert_equal ['='], md.captures + + %w(_hello_world ist! _maybe?).each do |suffix| + @target.class_eval "def attribute#{suffix}(*args) args end" + @target.attribute_method_suffix suffix + + assert_not_nil md = @target.match_attribute_method?("title#{suffix}") + assert_equal 'title', md.pre_match + assert_equal [suffix], md.captures + end end def test_declared_attribute_method_affects_respond_to_and_method_missing @@ -19,12 +35,15 @@ class AttributeMethodsTest < Test::Unit::TestCase assert !topic.respond_to?('title_hello_world') assert_raise(NoMethodError) { topic.title_hello_world } - @target.class_eval "def attribute_hello_world(*args) args end" - @target.attribute_method_suffix '_hello_world' + %w(_hello_world _it! _candidate= able?).each do |suffix| + @target.class_eval "def attribute#{suffix}(*args) args end" + @target.attribute_method_suffix suffix - assert topic.respond_to?('title_hello_world') - assert_equal ['title'], topic.title_hello_world - assert_equal ['title', 'a'], topic.title_hello_world('a') - assert_equal ['title', 1, 2, 3], topic.title_hello_world(1, 2, 3) + meth = "title#{suffix}" + assert topic.respond_to?(meth) + assert_equal ['title'], topic.send(meth) + assert_equal ['title', 'a'], topic.send(meth, 'a') + assert_equal ['title', 1, 2, 3], topic.send(meth, 1, 2, 3) + end end end -- cgit v1.2.3