我想检查我的实体属性是否在: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)
这样的现有实体时,它允许更新,因为它不会进入验证功能。
如何让它适用于这两种方法(创建和更新)?
答案 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)
默认情况下,对create
和update
运行Rails验证。所以应该只是:
validate :check_attributes
仅当您要验证:on
或create
时,才应使用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)