2010-11-25 53 views
3

我只需要驗證某個動作的模型(:create)。我知道這不是一個好策略,但我只需要在我的情況下這樣做。驗證某個動作的模型

我嘗試使用類似:

validate :check_gold, :if => :create 

validate :check_gold, :on => :create 

,但我得到的錯誤。問題是我不能讓我的自定義check_gold驗證在編輯時執行,但只能在創建時執行(因爲只有在創建聯盟時才進行檢查,而不是編輯)。

感謝名單閱讀:)


我追加了一些實際代碼:

attr_accessor :required_gold, :has_alliance 
    validate :check_gold 
    validate :check_has_alliance 

這是該聯盟的模式。 :required_gold和:has_alliance都在控制器中設置(它們是虛擬屬性,因爲我需要來自控制器的信息)。現在,實際的驗證程序是:

def check_gold 
    self.errors.add(:you_need, "100 gold to create your alliance!") if required_gold < GOLD_NEEDED_TO_CREATE_ALLIANCE 
    end 

    def check_has_alliance 
    self.errors.add(:you_already, "have an alliance and you cannot create another one !") if has_alliance == true 
    end 

這個偉大工程的創建,但我想限制它來創建單獨,而不是編輯或支架的其他行動。

+0

http://guides.rubyonrails.org/active_record_validations_callbacks.html#on它應該工作。你可以顯示代碼如何編輯你的模型? – tjeden 2010-11-25 21:39:10

+0

我編輯了帖子來顯示我的代碼,thanx :) – Spyros 2010-11-25 22:46:42

回答

8

全部ActiveRecord校驗器有一個:on選項。

validates_numericality_of :value, :on => :create 

使用validate_on_create回調,而不是validate

validate_on_create :check_gold 
validate_on_create :check_has_alliance 

編輯:

如果使用validates_each你可以使用可用於驗證申報的標準選項。

validates_each :required_gold, :has_alliance, :on => :create do |r, attr, value| 
    r.check_gold if attr == :required_gold 
    r.check_has_alliance if attr == :has_alliance 
end 
0

您需要查看回調。有人曾經告訴我這一點,我不明白他們的意思。只要做一個軌道回調搜索,你會得到的圖片。

在你的模型中,你需要做一個回調。您需要的回調是before_create,然後在創建對象之前,您將能夠執行一些邏輯來檢查錯誤。

model.rb

before_create :check_gold_validation 

def check_gold_validation 
    validate :check_gold 
end 

def check_gold 
    errors.add_to_base "Some Error" if self.some_condition? 
end 
0

像薩姆說,你需要一個回調before_create。回調基本上意味着'只要這個動作被觸發就執行這個方法'。 (更多關於回調在這裏:http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html)。

這是你在你的模型中想要的東西:

before_create :check_gold 

# other methods go here 

private # validations don't need to be called outside the model 

def check_gold 
    # do your validation magic here 
end 

以上的方法是最簡單的,做你想做的,但FYI有也使用before_save回調在創建執行其他操作的方法:

before_save :check_gold_levels 

# other methods 

private 
def check_gold_levels 
    initialize_gold_level if new? # this will be done only on creation (i.e. if this model's instance hasn't been persisted in the database yet) 
    verify_gold_level # this happens on every save 
end 

欲瞭解更多有關'新?見http://api.rubyonrails.org/classes/ActiveResource/Base.html#method-i-new%3F