2009-10-23 22 views
55

我剛將我的rails升級到了2.3.4,並且我注意到了這個驗證: 可以說我有一個簡單的模型Company,它有一個名字。沒有什麼。 我要經營自己的驗證:在Rails中調用自定義驗證方法

class Company < ActiveRecord::Base 

    validate :something 


    def something 
    false 
    end 

end 

保存模型的實際工作在這種情況下。 同樣的事情發生,如果我重寫validate()並返回false。 我注意到這是一個更復雜的模型,其中我的驗證返回false,但對象仍然保存...我嘗試了一個本質上是空的模型,並應用相同的事情。我錯過了一個新練習嗎?在我的一些舊的rails代碼中,這似乎不是這種情況。

+0

謝謝取代。這幾乎是絕對如此。我假設在新項目中,我忘記了添加錯誤,而在舊項目中,我肯定會把它們放在那裏。咄。謝謝你們。 – cgr

回答

107

當您使用validate方法時,將執行驗證。然而,rails不依賴於返回的值。

它依賴於是否存在驗證錯誤。所以你應該在模型沒有驗證的時候添加錯誤。

def something 
    errors.add(:field, 'error message') 
end 

或者,如果錯誤是不相關的字段:

def something 
    errors.add(:base, 'error message') 
end 

那麼你的模式不會被保存,因爲有錯誤。

+0

整潔,謝謝!這很有幫助 – marcgg

+0

從Rails 3開始,add_to_base不再正確。請參閱@MagedMakled的答案。 – Undistraction

+0

我剛更新了答案。謝謝。 –

14

您在驗證和回調之間感到困惑。

如果對象上有任何錯誤,驗證應該失敗,驗證返回無關緊要。回調失敗,如果它們返回false,無論它們是否將任何錯誤添加到對象。

Rails使用調用有效嗎?來自不檢查任何驗證結果的保存調用。

編輯: Rails認爲validate :method作爲回調,但有效嗎?仍然不檢查他們的結果,只檢查他們添加到對象中的錯誤。

我不認爲這種行爲完全改變,但我可能是錯的。我不認爲我曾經寫過驗證以返回false。

+1

我試圖爲new_records創建驗證,所以我創建了一個用於回調Obj.before_validation_on_create的方法,並添加了一些基本錯誤。但是,即使我的回調添加了基本錯誤,該對象也會被創建。它只有當我的回調返回「假」像你所建議的!感謝您指出如何使回調失敗 – Coderama

8

僅供參考errors.add_to_base('error message')已被棄用,在軌道3得到了由

errors[:base] << "Error message" 

或者

errors.add(:base, "Error message")