如何对多种方法进行模型验证?

时间:2015-08-20 16:19:32

标签: ruby-on-rails ruby validation model callback

我想检查我的实体属性是否在:create:update上的0到5之间。所以我在我的模型中添加了这样的验证:

class MyObject < ActiveRecord::Base

  attr_accessible :first_attribute, :second_attribute

  validate :check_attributes, on: :create and :update

  private

  def check_attributes
    if self.first_attribute < 0 || self.first_attribute> 5
      errors.add(:first_attribute, "first_attribute must be between 0 and 5")
    end
    if self.second_attribute < 0 || self.second_attribute > 5
      errors.add(:second_attribute , "second_attribute must be between 0 and 5")
    end
  end

end

它适用于创作:当我尝试创建像MyObject.create!(first_attribute: 7, second_attribute: 4)这样的实体时,我收到错误。如果我将值设置在0到5之间,则会创建实体。

但是当我更新像my_entity.update_attributes!(first_attribute: 7)这样的现有实体时,它允许更新,因为它不会进入验证功能。

如何让它适用于这两种方法(创建和更新)?

3 个答案:

答案 0 :(得分:2)

该行应为

validate :check_attributes, on: [:create, :update]

但您也可以使用内置验证。 :create:update也是on的默认值,因此您也可以省略它:

validates :first_attribute,
          inclusion: { in: 0..5, message: "must be between 0  and 5" },
validates :second_attribute,
          inclusion: { in: 0..5, message: "must be between 0  and 5" },

答案 1 :(得分:1)

默认情况下,对createupdate运行Rails验证。所以应该只是:

validate :check_attributes

请参阅Rails Documentation

仅当您要验证:oncreate时,才应使用update选项。但是,如果您想对两者进行验证,则不需要指定:on选项。默认情况下,Rails将对两者进行验证。

但是,有更好的方法来验证0到5之间的属性。您可以使用Rails inclusion helper来执行此操作,而不是定义自己的自定义验证器。

validates :first_attribute,
          inclusion: { in: 0..5, message: "first_attribute  must be between 0 and 5" },
validates :second_attribute,
          inclusion: { in: 0..5, message: "second_attribute  must be between 0 and 5" }

答案 2 :(得分:0)

你试过吗

validate :check_attributes, :on => [:create, :update]

使用此功能,验证将仅在创建和更新操作中运行。 这是指向apidocs的链接。