2011-09-25 52 views
5

是否有任何方式僅在特定形式(控制器的操作)下觸發驗證,而不是在每次保存或更新時全局觸發驗證? 像User.create(:validate=>true)標誌。僅以特定形式驗證

+0

你爲什麼要這麼做?如果我們知道你的問題背後的原因,也許我們可以給出更好的答案。 – rdvdijk

+0

我弄錯了用戶模型,沒有與配置文件分開,當你註冊時,你只​​需要提供幾個字段,剩下的就是從編輯用戶操作中填寫。 – methyl

+0

順便說一句,你可以通過所有這樣的驗證:Model.save(false) – emrahbasman

回答

8

是的,你可以提供條件語句的驗證,如:

validates_presence_of :something, :if => :special? 

private 

def make_sepcial 
    @special = true 
end 

def special? 
    @special 
end 

現在,所有你需要做的,打開這些驗證是:

s = SomeModel.new 
s.make_special 
+0

所以,在保存模型後我必須設置爲false,對吧? – methyl

+0

沒有。 '@ special'只是一個實例變量。除非你有進一步的工作要做,否則你可以讓它死亡,它不會被持續到進一步的數據庫查詢。 – thomasfedb

4

正如你在評論中解釋說,你想跳過對新記錄的驗證。在這種情況下,你可以使用thomasfedb的答案,但不使用@special變量,但:

validates_presence_of :something, :if => :persisted? 

這隻會驗證爲保存User S,但是對新User秒。請參閱persisted?上的API文檔。

+0

您也可以使用:除非=>:持續?如果你想新的反向驗證,但不保存。 –

+0

這是正確的答案 – doz87