我需要仅针对特定操作验证模型(:create)。我知道这不是一个好策略,但我只需要这样做。
我尝试使用类似的东西:
validate :check_gold, :if => :create
或
validate :check_gold, :on => :create
但我得到错误。问题是我无法在编辑时执行自定义check_gold验证,但仅在创建时执行(因为只有在创建联盟而不是编辑联盟时才需要检查黄金)。
Thanx阅读:)
我正在附加一些实际代码:
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 :(得分: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
答案 1 :(得分:0)
你需要调查回调。曾经有人告诉过我,我不明白他们的意思。只需搜索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
答案 2 :(得分: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
上面的方法是最简单的做你想做的事情,但是我还有一种方法可以使用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
有关'new?'的更多信息见http://api.rubyonrails.org/classes/ActiveResource/Base.html#method-i-new%3F