验证某些操作的模型

Spy*_*ros 3 validation ruby-on-rails

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

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

validate :check_gold, :if => :create
Run Code Online (Sandbox Code Playgroud)

要么

validate :check_gold, :on => :create
Run Code Online (Sandbox Code Playgroud)

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

Thanx阅读:)


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

  attr_accessor :required_gold, :has_alliance
  validate :check_gold
  validate :check_has_alliance
Run Code Online (Sandbox Code Playgroud)

这是联盟模式.: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
Run Code Online (Sandbox Code Playgroud)

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

Har*_*tty 8

所有ActiveRecord验证器都有一个:on选项.

validates_numericality_of :value, :on => :create 
Run Code Online (Sandbox Code Playgroud)

使用validate_on_create回调代替validate:

validate_on_create :check_gold
validate_on_create :check_has_alliance
Run Code Online (Sandbox Code Playgroud)

编辑:

如果使用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
Run Code Online (Sandbox Code Playgroud)