mirror of https://github.com/rails/rails
`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`.
This commit is contained in:
parent
9a18a10e1c
commit
b63701e272
|
@ -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:
|
||||
|
|
|
@ -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`.
|
||||
|
||||
````
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue