【问题标题】:Rails Validations and custom error messagesRails 验证和自定义错误消息
【发布时间】:2012-05-13 15:29:30
【问题描述】:

我遇到了验证问题,如果我使用以下语法,一切都很好(没有失败)。

validates :title, uniqueness: true

但是,如果我将其更改为此,我会失败。

validates :title, uniqueness: {message: 'Title must be unique'}

这里是完整性测试:

test "product is not valid without a unique title " do
  product = Product.new( title: products(:ruby).title,
  description: "yyy",
  price: 1,
  image_url: "fred.gif" )

  assert !product.save
  assert_equal "has already been taken", product.errors['title'].join('; ')
end

我有一个固定装置,可以为 Ruby 产品等添加书名。

据我了解,这两个验证应该是相同的,只是一个提供了自定义错误消息。这是我在使用自定义消息时遇到的错误。

1) 失败: test_product_is_not_valid_without_a_unique_title_(ProductTest) 预期但已 .

提前感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails ruby validation


    【解决方案1】:

    这里:

    assert_equal "has already been taken", product.errors['title'].join('; ')
    

    您希望在错误哈希中看到“已被占用”,但您已使用自定义消息覆盖了此消息。测试显示您的自定义消息按原样显示。为什么你仍然期待默认消息?你必须期待Title must be unique

    提示不要在自定义消息中提供字段名称。 Rails 会在生成错误时自动处理它,比如product.errors.full_messages(“必须是唯一的”就足够了)。

    【讨论】:

    • 不是我不希望看到自定义消息,除非我尝试插入重复的标题,否则我根本不希望看到消息?感谢您提供有关不输入字段名称的提示;)
    • 您的测试数据库不是已经装满了您的固定装置吗?您似乎正在尝试使用现有标题创建记录。
    • 是的,但无论我是否使用自定义消息,我都不应该遇到失败。 validates :title, uniqueness: true 在我运行测试时仍应触发失败。正如您所说,夹具将使用测试数据加载数据库,因此任何一个 validates 子句都应该触发失败。除非我错过了什么?
    • 不,你不应该得到错误。在您的测试中使用validates :title, uniqueness: true + assert_equal "has already been taken", product.errors['title'].join('; ') 会导致您的测试通过,因为您的记录仍未保存,但使用uniqueness: true,您对错误的期望与您得到的错误相匹配。你一定对这种“消极”的期望感到困惑。 当您的记录无法自行保存时,您的测试通过。但是记录本身并没有抱怨这种失败。它只返回false 作为save 的结果(并通过assert !product.save 进行检查——注意!)。
    • 好的,我现在明白了,整个问题与测试失败无关,只是消息与预期不同。我删除了断言并使用自定义消息验证,测试以 0 次失败运行。仍然不确定我是否同意这应该导致失败消息,测试在两种情况下都按预期运行,我只是在其中一种情况下覆盖了错误消息。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2021-12-09
    • 1970-01-01
    • 2016-04-18
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多