2011-09-05 33 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 –