2011-09-05 35 views

回答

3

通过“采取”,我假定你的意思是标题已经存在于数据库中。我进一步假设你有你的Post模型下面一行:

validates_uniqueness_of :title 

就个人而言,我认为检查,看看标题已经采取通过检查验证错误将是脆弱的。 @post.errors[:title]将返回类似["has already been taken"]。但是如果您决定更改错误消息或者如果您将应用程序国际化了呢?我想你会更好编写方法做测试:

class Post < ActiveRecord::Base 
    def title_unique? 
    Post.where(:title => self.title).count == 0 
    end 
end 

然后你就可以测试,如果标题是@post.title_unique?独特。如果已经有一个Rubygem动态地将这种方法添加到ActiveRecord模型中,我不会感到惊讶。

+0

嗯,我还可以使用,但我想知道是否有一种简单的方法来检测哪个验证失败。无论如何感谢 –

3

最近我遇到了一种情况,我需要同样的事情:用户可以从一个表单中一次添加/编辑多个记录。

由于在验证时并非所有记录都已写入数据库,因此我无法使用@David的解决方案。为了使事情变得更加复杂,有可能数据库中已有的记录可能会变成重复数据,这些数据会被唯一性验证程序检测到。

TL; DR:您不能检查特定验证,但你可以检查特定错误

我使用这个:

# The record has a duplicate value in `my_attribute`, detected by custom code. 
if my_attribute_is_not_unique? 
    # Check if a previous uniqueness validator has already detected this: 
    unless @record.errors.added?(:my_attribute, :taken) 
    # No previous `:taken` error or at least a different text. 
    @record.errors.add(:my_attribute, :taken) 
    end 
end 

一些言论:

  • 它的工作与的I18n,但你必须提供相同的插值参数added?作为一个验证程序一样。
  • 如果之前的验证写了一个自定义消息,而不是默认的(:taken
+0

这个问题TLDR可以更新为包含'errors.details'这使得这成为可能。更多在http://stackoverflow.com/a/41675301/67834 –