diff options
author | Michael Koziarski <michael@koziarski.com> | 2007-09-17 09:29:02 +0000 |
---|---|---|
committer | Michael Koziarski <michael@koziarski.com> | 2007-09-17 09:29:02 +0000 |
commit | acbec3e565909da5811488e88066a01f71b68a94 (patch) | |
tree | 3918c0ee69cdd55d82286de127c4f6bc2b0d27e4 | |
parent | bfb906a905a1e8774e438b10e8cf703a829b55dc (diff) | |
download | rails-acbec3e565909da5811488e88066a01f71b68a94.tar.gz rails-acbec3e565909da5811488e88066a01f71b68a94.tar.bz2 rails-acbec3e565909da5811488e88066a01f71b68a94.zip |
Ensure that custom mutators aren't redefined by define_attribute_methods. [Koz]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7500 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r-- | activerecord/lib/active_record/attribute_methods.rb | 13 | ||||
-rwxr-xr-x | activerecord/test/base_test.rb | 7 | ||||
-rwxr-xr-x | activerecord/test/fixtures/topic.rb | 6 |
3 files changed, 23 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb index 657abc8b8d..460b5ff244 100644 --- a/activerecord/lib/active_record/attribute_methods.rb +++ b/activerecord/lib/active_record/attribute_methods.rb @@ -58,7 +58,7 @@ module ActiveRecord def define_attribute_methods return if generated_methods? columns_hash.each do |name, column| - unless instance_methods.include?(name) + unless instance_method_already_defined?(name) if self.serialized_attributes[name] define_read_method_for_serialized_attribute(name) else @@ -66,15 +66,22 @@ module ActiveRecord end end - unless instance_methods.include?("#{name}=") + unless instance_method_already_defined?("#{name}=") define_write_method(name.to_sym) end - unless instance_methods.include?("#{name}?") + unless instance_method_already_defined?("#{name}?") define_question_method(name) end end end + + def instance_method_already_defined?(method_name) + method_defined?(method_name) || + private_method_defined?(method_name) || + protected_method_defined?(method_name) + end + alias :define_read_methods :define_attribute_methods diff --git a/activerecord/test/base_test.rb b/activerecord/test/base_test.rb index bf9a8a5f90..4fb7f39ecc 100755 --- a/activerecord/test/base_test.rb +++ b/activerecord/test/base_test.rb @@ -394,6 +394,13 @@ class BasicsTest < Test::Unit::TestCase assert_equal 9900, Topic.find(2).written_on.usec end end + + def test_custom_mutator + topic = Topic.find(1) + # This mutator is protected in the class definition + topic.send(:approved=, true) + assert topic.instance_variable_get("@custom_approved") + end def test_destroy topic = Topic.find(1) diff --git a/activerecord/test/fixtures/topic.rb b/activerecord/test/fixtures/topic.rb index d7cd52e33e..dd71d6bf2b 100755 --- a/activerecord/test/fixtures/topic.rb +++ b/activerecord/test/fixtures/topic.rb @@ -13,8 +13,14 @@ class Topic < ActiveRecord::Base def topic_id id end + protected + def approved=(val) + @custom_approved = val + write_attribute(:approved, val) + end + def default_written_on self.written_on = Time.now unless attribute_present?("written_on") end |