2013-05-08 25 views
1

我想允許沒有圖像或具有獨特的圖像發佈任何消息,我在我的模型中添加以下代碼正確驗證的單一性,可發佈,而不上傳

validates :image_fingerprint, :uniqueness => true 

它禁止張貼類似的圖像,但它禁止在沒有圖像的情況下發布多條消息。我嘗試添加

:allow_blank => true

:allow_nil => true

,但它會導致以下錯誤:

TypeError in PostsController#create can't convert nil into String

我怎樣才能解決呢?

+0

是'image_fingerprint'保存爲'nil'或空字符串時沒有圖像出現? – 2013-05-08 12:00:56

+0

image_fingerprint它是由回形針生成的md5散列,它被保存到「image_fingerprint」數據庫類型的字符串中,當沒有圖像時單元格爲空,這就是我所知道的。 – user1887348 2013-05-09 04:07:43

回答

2

你可以驗證使用:unless,僅當此屬性不是空白

validates :image_fingerprint, :uniqueness => true, 
    :unless => Proc.new { |a| a.image_fingerprint.blank? } 

參考:

You can associate the :if and :unless options with a symbol corresponding to the name of a method that will get called right before validation happens. This is the most commonly used option.

Finally, it’s possible to associate :if and :unless with a Proc object which will be called. Using a Proc object gives you the ability to write an inline condition instead of a separate method. This option is best suited for one-liners.

http://guides.rubyonrails.org/active_record_validations_callbacks.html#conditional-validation

+0

我已經試過類似的東西,它沒有幫助,我仍然得到「不能轉換成字符串零」 – user1887348 2013-05-09 04:04:27

+1

@ user1887348,我認爲這個錯誤不是關於驗證,但你如何保存對象。如果未填充,您可能需要檢查image_fingerprint的值是否爲零。這是不可接受的,如果未填充,則需要將此字段轉換爲空白字符串。 – 2013-05-09 04:18:45

+0

哦,我只是想過:3但事實並非如此。我發現這個錯誤,原因是另一個函數,在創建之前調用,我完全忘記了,該函數取決於文件名,當它爲零時失敗。我完全不知道錯誤信息是如此愚蠢。當我添加以下內容時,一切正常:allow_blank =>對正確性檢查和:除非=> Proc.new {| a | a.image_fingerprint.blank? }函數調用。 – user1887348 2013-05-09 05:00:06