我正在尝试在 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模块。
更新:另一种解决方案可能是,你不是将字符串推入错误哈希,而是填充你自己的类的实例,一个像字符串一样嘎嘎叫但会用额外的方法和状态等装饰的类。