mirror of
https://github.com/github/rails.git
synced 2026-04-04 03:00:58 -04:00
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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user