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

时间:2011-05-16 14:18:20

标签: ruby-on-rails-3 validation

我正在尝试将一些其他数据与标准错误消息一起存储在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当前那样简单地将其插入到消息中?

2 个答案:

答案 0 :(得分:3)

我之前没有这么做过,但我首先想到的是在对象上创建一个名为duplicates的新方法。

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

然后,您必须手动拦截视图中的错误,以便在“帖子重复!”时打印出所有重复项。遇到错误。

答案 1 :(得分:2)

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

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

相关问题