2011-10-30 75 views
9

對於 validates驗證選項是否可以有多個條目?Rails驗證... multiple:on options?

類似以下內容:

class Library < ActiveRecord::Base 

    validates :presence => true, :on => [:create, :update, :some_other_action] 

end 

基本上我想運行一個特定的驗證當多個 動作稱爲控制器。例如,我想 驗證create操作的某些用戶信息,update操作, 以及可能的其他一些操作。

雖然我不想驗證在所有方法上運行。

另外,如果有更簡單的方法來做到這一點,那也太棒了!

在此先感謝!

回答

5

是的創建和更新!

:on - 指定驗證何時處於活動狀態。在默認情況下(無)所有的驗證環境中運行,其他選項:創建:更新

但是認爲這些價值觀的數據庫數據創建或更新語句,而不是軌控制器動作。他們可能會對數據和數據庫做類似的事情,但它們是不同的。
例如,您可能有另一個rails方法,它也會更新數據庫,可能會更新不同的字段,但上述':update'仍然會考慮該方法,即使它不是來自名爲'update'的rails動作。

+0

其實你可以使用自定義驗證上下文正確的。[:on - 指定此驗證處於活動狀態的上下文(例如,在:: create或on :: custom_validation_context中)]](http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method- I-有效)。然後你可以使用'#valid?(:my_context)'或'#save(context::my_context)'。不幸的是,沒有辦法一次定義多個上下文(既沒有'on:'也沒有將一個數組(或多個參數)傳遞給'#valid?')。 –

2

這是不可能的。爲什麼?這些:on事件不是內部控制器動作的名稱,但預定的ActiveRecord(MODEL)的事件,:create:update:save

有控制器的方法和模型方法之間沒有自動連接。

0

具有非常類似的問題,在這裏我不得不跳過驗證某些控制器的動作,我嘗試了上面的方法,但我的問題是有點不同所以他們沒有爲我工作,所以我所做的就是使用attr_accessor和unless配置。

它會順利地爲您的事業工作。

在型號

validates :password, presence: true, unless: :skip_password_validation 

attr_accessor :skip_password_validation 

,當談到的情況,我並不需要驗證,我只是讓它在控制器

@user = User.find(params[:id]) 
@user.skip_password_validation = true