2011-02-22 48 views
23

我有幾個簡單的模型被像這樣有關:驗證:存在VS使用validates_presence_of軌道3

模型

class Task < ActiveRecord::Base 
    belongs_to :user 
    validates :name, :presence => true, :message => 'Name cannot be blank, Task not saved' 
end 

class User < ActiveRecord::Base 
    has_many :tasks 
end 

觀點已經像這樣在這一個電話: user.tasks < - 然後,我通過任務循環

的問題:

在任務模式 -

當我使用:

validates :name, :presence => true , :message => 'Name cannot be blank, Task not saved' 

我得到一個500錯誤:

ActionView::Template::Error (uninitialized constant User::Task): 
NameError in View file 

當我使用:

validates_presence_of :name 

一切正常。

我認爲兩者都驗證了上述方法,其中......問題與關聯有關,以及驗證如何與相關模型綁定。我有一種預感,事情正在發生,但這只是一種預感。

任何幫助將不勝感激。非常感謝。

回答

48

當您使用較新的validates :name格式時,可以將多個驗證放在一行中,而不必爲每種類型的驗證都設置多行。因此,當Rails點擊你的參數:message時,它認爲這是一種驗證方法,而不是與:presence相關的消息。試試這個:

validates :name, :presence => {:message => 'Name cannot be blank, Task not saved'} 

此外,根據你如何展示你的錯誤的,這個錯誤可能實際上顯示爲「名稱名稱不能......」;如果是這樣,您需要將消息設置爲'不能爲空,未保存任務'。

+0

非常感謝!這就是訣竅! – RidingRails

+1

我對此有一個關於國際化的問題。如果Rails提供字段名稱,那麼這個錯誤消息如何完全本地化?例如,在西班牙語中,'name'應該是'nombre'。有什麼辦法可以完全抑制默認信息嗎? – jn29098

+0

我知道這是一箇舊帖子,但是應該在哪裏顯示這個錯誤消息,並且在提交表單後顯示,例如?謝謝 – Richlewis