Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Raise UnknownAttributeError when unknown attributes are supplied via …

…mass assignment
  • Loading branch information...
commit 108db00aa90fe266564483ab301cf0669cae600f 1 parent f64bd2c
Pratik lifo authored
10 activerecord/lib/active_record/base.rb
View
@@ -122,6 +122,10 @@ class DangerousAttributeError < ActiveRecordError
class MissingAttributeError < NoMethodError
end
+ # Raised when unknown attributes are supplied via mass assignment.
+ class UnknownAttributeError < NoMethodError
+ end
+
# Raised when an error occurred while doing a mass assignment to an attribute through the
# <tt>attributes=</tt> method. The exception has an +attribute+ property that is the name of the
# offending attribute.
@@ -2400,7 +2404,11 @@ def attributes=(new_attributes, guard_protected_attributes = true)
attributes = remove_attributes_protected_from_mass_assignment(attributes) if guard_protected_attributes
attributes.each do |k, v|
- k.include?("(") ? multi_parameter_attributes << [ k, v ] : send(k + "=", v)
+ if k.include?("(")
+ multi_parameter_attributes << [ k, v ]
+ else
+ respond_to?(:"#{k}=") ? send(:"#{k}=", v) : raise(UnknownAttributeError, "unknown attribute: #{k}")
+ end
end
assign_multiparameter_attributes(multi_parameter_attributes)
8 activerecord/test/cases/base_test.rb
View
@@ -904,6 +904,14 @@ def test_customized_primary_key_remains_protected_when_referred_to_as_id
assert_nil keyboard.id
end
+ def test_mass_assigning_invalid_attribute
+ firm = Firm.new
+
+ assert_raises(ActiveRecord::UnknownAttributeError) do
+ firm.attributes = { "id" => 5, "type" => "Client", "i_dont_even_exist" => 20 }
+ end
+ end
+
def test_mass_assignment_protection_on_defaults
firm = Firm.new
firm.attributes = { "id" => 5, "type" => "Client" }
Please sign in to comment.
Something went wrong with that request. Please try again.