Skip to content
Permalink
Browse files

`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`.
  • Loading branch information...
sgrif committed Oct 30, 2018
1 parent 9a18a10 commit b63701e272f3dc932ba7a20127f6dc82b567cfb4
@@ -206,6 +206,7 @@ def with_value_from_database(value)
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 @@ def update_columns(attributes)
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 @@ def setup
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"

0 comments on commit b63701e

Please sign in to comment.
You can’t perform that action at this time.