如何在 Rails 3 中存储带有验证错误消息的额外数据



我正在尝试在 Rails 3 的自定义验证器中存储一些额外的数据以及标准错误消息。

例如,(忽略内置验证器)假设我想在保存之前检查帖子是否重复。我可能会像这样编写我的自定义验证方法:

class Post < ActiveRecord::Base
  # prevent duplicate posts
  validate do |post|
    duplicates = Post.find_all_by_body(body)
    errors.add_to_base("Post is a duplicate!") if duplicates.length
    # something like this is desired:
    # errors.add_to_base("Post is a duplicate",
    #  :extra => { :duplicates => duplicates })
  end
end

这将使用户知道存在重复项,但在添加错误消息的同时,我还想存储重复项,以便可以向用户显示它们。我将如何存储验证期间检索到的重复帖子列表,使其与body字段的记录错误相关联,并可供我查看?

一个更简单的例子可能是长度验证:如果字段超过其最大长度,我如何存储最大长度以及错误消息,而不是像 Rails 当前那样简单地将其插入到消息中?

我以前不必这样做,但我的第一个想法是在对象上创建一个名为重复项的新方法。

attr_accessor :duplicates

然后在自定义验证方法中,可以在对象上设置重复项,以便在呈现错误时将其提供给视图。请注意,您当前的代码没有太大变化:

validate do |post|
  duplicates = Post.find_all_by_body(body)
  errors.add_to_base("Post is a duplicate!") if duplicates.size > 0
end

然后,您必须在视图中手动截获该错误,以便在遇到"Post是重复的!"错误时可以打印出所有重复项。

您可以将选项传递给错误,但它们仅在 i18n 模板中用作替换。长话短说,不,您不能在错误哈希中存储有关错误的元数据。如果你需要这样的功能,你需要查看Rails核心中的ActiveModel::Errors模块。

更新:另一种解决方案可能是,你不是将字符串推入错误哈希,而是填充你自己的类的实例,一个像字符串一样嘎嘎叫但会用额外的方法和状态等装饰的类。

相关内容

  • 没有找到相关文章

最新更新