验证某些操作的模型

时间:2010-11-25 21:31:45

标签: ruby-on-rails validation

我需要仅针对特定操作验证模型(: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

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

3 个答案:

答案 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