是否可以将错误添加到ActiveRecord对象而不将它们与特定属性相关联?

age*_*eto 22 ruby-on-rails

如果您需要对相当复杂的验证进行编码,则错误有时不会出现在特定属性中,而是存在于其中几个属性的组合中.

例如,如果我想验证:start_date和:end_date之间的时间段不包含任何星期日,则错误不属于这些字段中的任何一个,但错误添加方法需要指定它.

MrD*_*anA 30

尝试做这样的事情:

# Your Model.rb
validate :my_own_validation_method

...

private

def my_own_validation_method
    if there_is_no_sunday_in_the_range
        self.errors[:base] << "You must have a Sunday in the time range!"
    end
end
Run Code Online (Sandbox Code Playgroud)

基本上,您可以将自己的复杂验证添加到模型中,当您发现错误发生时,可以在错误数组中添加错误字符串.

  • 通常,您可以向特定属性添加错误.例如,如果你有一个具有`age`属性的`User`模型,你可能想为该属性添加一个错误,所以你会写`self.errors [:age] <<"不能小于0 "`这将产生类似"年龄不能小于0"的错误.但如果错误与任何特定属性无关,则可以将其添加到基础,即模型本身.所以`self.errors [:base] <<"一切都错了!"`发出错误信息"一切都错了!"; 它没有连接到任何特定属性. (4认同)

Vik*_*rón 8

model_instance.errors[:base] << "msg"
Run Code Online (Sandbox Code Playgroud)


Bre*_*lle 7

上面的答案已经过时了。对于 Rails 5 及更高版本,您需要使用第一个参数调用ActiveModel::Errors 添加方法:base。请参阅下面的示例。

model_instance.errors.add(
  :base, 
  :name_or_email_blank, 
  message: "either name or email must be present"
)
Run Code Online (Sandbox Code Playgroud)


Nat*_*ate 5

您可以使用errors[:base]添加与一个属性无关的常规错误 - rails guide link.