提交 3650ca98 编写于 作者: J Jahfer Husain

Add ActiveModel::Errors#merge!

ActiveModel::Errors#merge! allows ActiveModel::Errors to append errors from
a separate ActiveModel::Errors instance onto their own.

Example:

    person = Person.new
    person.errors.add(:name, :blank)

    errors = ActiveModel::Errors.new(Person.new)
    errors.add(:name, :invalid)

    person.errors.merge!(errors)
    puts person.errors.messages
    # => { name: ["can't be blank", "is invalid"] }
上级 c9b514cd
* Add method `#merge!` for `ActiveModel::Errors`.
*Jahfer Husain*
* Fix regression in numericality validator when comparing Decimal and Float input
values with more scale than the schema.
......
......@@ -93,6 +93,18 @@ def copy!(other) # :nodoc:
@details = other.details.dup
end
# Merges the errors from <tt>other</tt>.
#
# other - The ActiveModel::Errors instance.
#
# Examples
#
# person.errors.merge!(other)
def merge!(other)
@messages.merge!(other.messages) { |_, ary1, ary2| ary1 + ary2 }
@details.merge!(other.details) { |_, ary1, ary2| ary1 + ary2 }
end
# Clear the error messages.
#
# person.errors.full_messages # => ["name cannot be nil"]
......
......@@ -375,6 +375,18 @@ def test_no_key
assert_equal [:name], person.errors.details.keys
end
test "merge errors" do
errors = ActiveModel::Errors.new(Person.new)
errors.add(:name, :invalid)
person = Person.new
person.errors.add(:name, :blank)
person.errors.merge!(errors)
assert_equal({ name: ["can't be blank", "is invalid"] }, person.errors.messages)
assert_equal({ name: [{ error: :blank }, { error: :invalid }] }, person.errors.details)
end
test "errors are marshalable" do
errors = ActiveModel::Errors.new(Person.new)
errors.add(:name, :invalid)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册