diff options
author | Sean Griffin <sean@seantheprogrammer.com> | 2018-10-30 12:52:23 -0600 |
---|---|---|
committer | Sean Griffin <sean@seantheprogrammer.com> | 2018-10-30 12:52:23 -0600 |
commit | b63701e272f3dc932ba7a20127f6dc82b567cfb4 (patch) | |
tree | 1eb65b792ad7835c67449c81cb6c4f1b7b4be1d3 | |
parent | 9a18a10e1cf6dd971d170f3684717c2ffe687776 (diff) | |
download | rails-b63701e272f3dc932ba7a20127f6dc82b567cfb4.tar.gz rails-b63701e272f3dc932ba7a20127f6dc82b567cfb4.tar.bz2 rails-b63701e272f3dc932ba7a20127f6dc82b567cfb4.zip |
`update_columns` raises if the column is unknown
Previosly, `update_columns` would just take whatever keys you gave it
and tried to run the update query. Most likely this would result in an
error from the database. However, if the column actually did exist, but
was in `ignored_columns`, this would result in the method returning
successfully when it should have raised, and an attribute that should
not exist written to `@attributes`.
-rw-r--r-- | activemodel/lib/active_model/attribute.rb | 1 | ||||
-rw-r--r-- | activerecord/CHANGELOG.md | 5 | ||||
-rw-r--r-- | activerecord/lib/active_record/persistence.rb | 8 | ||||
-rw-r--r-- | activerecord/test/cases/attribute_methods_test.rb | 6 |
4 files changed, 16 insertions, 4 deletions
diff --git a/activemodel/lib/active_model/attribute.rb b/activemodel/lib/active_model/attribute.rb index 3f19cda07b..75f60d205e 100644 --- a/activemodel/lib/active_model/attribute.rb +++ b/activemodel/lib/active_model/attribute.rb @@ -206,6 +206,7 @@ module ActiveModel raise ActiveModel::MissingAttributeError, "can't write unknown attribute `#{name}`" end alias_method :with_value_from_user, :with_value_from_database + alias_method :with_cast_value, :with_value_from_database end class Uninitialized < Attribute # :nodoc: diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index d4f6e6ae48..9d80bbe51f 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,8 @@ +* `update_columns` now correctly raises `ActiveModel::MissingAttributeError` + if the attribute does not exist. + + *Sean Griffin* + * Add support for hash and url configs in database hash of `ActiveRecord::Base.connected_to`. ```` diff --git a/activerecord/lib/active_record/persistence.rb b/activerecord/lib/active_record/persistence.rb index 45ceb1e3ad..f991a3076e 100644 --- a/activerecord/lib/active_record/persistence.rb +++ b/activerecord/lib/active_record/persistence.rb @@ -479,15 +479,15 @@ module ActiveRecord verify_readonly_attribute(key.to_s) end + attributes.each do |k, v| + write_attribute_without_type_cast(k, v) + end + affected_rows = self.class._update_record( attributes, self.class.primary_key => id_in_database ) - attributes.each do |k, v| - write_attribute_without_type_cast(k, v) - end - affected_rows == 1 end diff --git a/activerecord/test/cases/attribute_methods_test.rb b/activerecord/test/cases/attribute_methods_test.rb index 0bfd46a522..6c2e256447 100644 --- a/activerecord/test/cases/attribute_methods_test.rb +++ b/activerecord/test/cases/attribute_methods_test.rb @@ -310,6 +310,12 @@ class AttributeMethodsTest < ActiveRecord::TestCase assert_equal "New topic", topic.title end + test "write_attribute raises ActiveModel::MissingAttributeError when the attribute does not exist" do + topic = Topic.first + assert_raises(ActiveModel::MissingAttributeError) { topic.update_columns(no_column_exists: "Hello!") } + assert_raises(ActiveModel::UnknownAttributeError) { topic.update(no_column_exists: "Hello!") } + end + test "read_attribute" do topic = Topic.new topic.title = "Don't change the topic" |