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
这适用于创建,但我想限制它单独创建而不是编辑或脚手架的其他操作。
所有ActiveRecord
validation器都有: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