mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Add slice! method to ActiveModel::Errors
This commit is contained in:
parent
218e50ce59
commit
ee2b84f3cb
3 changed files with 39 additions and 0 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
* Add `#slice!` method to `ActiveModel::Errors`.
|
||||||
|
|
||||||
|
*Daniel López Prat*
|
||||||
|
|
||||||
* Fix numericality validator to still use value before type cast except Active Record.
|
* Fix numericality validator to still use value before type cast except Active Record.
|
||||||
|
|
||||||
Fixes #33651, #33686.
|
Fixes #33651, #33686.
|
||||||
|
|
|
@ -112,6 +112,17 @@ module ActiveModel
|
||||||
@details.merge!(other.details) { |_, ary1, ary2| ary1 + ary2 }
|
@details.merge!(other.details) { |_, ary1, ary2| ary1 + ary2 }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Removes all errors except the given keys. Returns a hash containing the removed errors.
|
||||||
|
#
|
||||||
|
# person.errors.keys # => [:name, :age, :gender, :city]
|
||||||
|
# person.errors.slice!(:age, :gender) # => { :name=>["cannot be nil"], :city=>["cannot be nil"] }
|
||||||
|
# person.errors.keys # => [:age, :gender]
|
||||||
|
def slice!(*keys)
|
||||||
|
keys = keys.map(&:to_sym)
|
||||||
|
@details.slice!(*keys)
|
||||||
|
@messages.slice!(*keys)
|
||||||
|
end
|
||||||
|
|
||||||
# Clear the error messages.
|
# Clear the error messages.
|
||||||
#
|
#
|
||||||
# person.errors.full_messages # => ["name cannot be nil"]
|
# person.errors.full_messages # => ["name cannot be nil"]
|
||||||
|
|
|
@ -411,6 +411,30 @@ class ErrorsTest < ActiveModel::TestCase
|
||||||
assert_equal({ name: [{ error: :blank }, { error: :invalid }] }, person.errors.details)
|
assert_equal({ name: [{ error: :blank }, { error: :invalid }] }, person.errors.details)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "slice! removes all errors except the given keys" do
|
||||||
|
person = Person.new
|
||||||
|
person.errors.add(:name, "cannot be nil")
|
||||||
|
person.errors.add(:age, "cannot be nil")
|
||||||
|
person.errors.add(:gender, "cannot be nil")
|
||||||
|
person.errors.add(:city, "cannot be nil")
|
||||||
|
|
||||||
|
person.errors.slice!(:age, "gender")
|
||||||
|
|
||||||
|
assert_equal [:age, :gender], person.errors.keys
|
||||||
|
end
|
||||||
|
|
||||||
|
test "slice! returns the deleted errors" do
|
||||||
|
person = Person.new
|
||||||
|
person.errors.add(:name, "cannot be nil")
|
||||||
|
person.errors.add(:age, "cannot be nil")
|
||||||
|
person.errors.add(:gender, "cannot be nil")
|
||||||
|
person.errors.add(:city, "cannot be nil")
|
||||||
|
|
||||||
|
removed_errors = person.errors.slice!(:age, "gender")
|
||||||
|
|
||||||
|
assert_equal({ name: ["cannot be nil"], city: ["cannot be nil"] }, removed_errors)
|
||||||
|
end
|
||||||
|
|
||||||
test "errors are marshalable" do
|
test "errors are marshalable" do
|
||||||
errors = ActiveModel::Errors.new(Person.new)
|
errors = ActiveModel::Errors.new(Person.new)
|
||||||
errors.add(:name, :invalid)
|
errors.add(:name, :invalid)
|
||||||
|
|
Loading…
Reference in a new issue