validation某些操作的模型

我需要仅针对特定操作validation模型(:create)。 我知道这不是一个好策略,但我只需要在我的情况下这样做。

我尝试过使用类似的东西:

validate :check_gold, :if => :create 

要么

 validate :check_gold, :on => :create 

但我得到错误。 问题是我无法在编辑时执行自定义check_goldvalidation,但仅在创建时执行(因为只有在创建联盟,而不是编辑联盟时才需要检查黄金)。

Thanx阅读:)


我正在附加一些实际的代码:

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

这是联盟模式。 :required_gold和:has_alliance都在控制器中设置(它们是虚拟属性,因为我需要来自控制器的信息)。 现在,实际的validation器是:

  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 

这适用于创建,但我想限制它单独创建而不是编辑或脚手架的其他操作。

所有ActiveRecordvalidation器都有:on选项。

 validates_numericality_of :value, :on => :create 

使用validate_on_create回调而不是validate

 validate_on_create :check_gold validate_on_create :check_has_alliance 

编辑:

如果使用validates_each ,则可以使用可用于validation器声明的标准选项。

 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 

就像Sam说的那样,你需要一个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 (ie 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

你需要调查回调。 曾经有人告诉我这件事,我不明白他们的意思。 只需搜索rails回调即可获得图片。

在您的模型中,您需要进行回调。 您需要的回调是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