我正在尝试将一些其他数据与标准错误消息一起存储在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当前那样简单地将其插入到消息中?
答案 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模块。
更新: 另一个解决方案可能是,不是将字符串推入错误哈希,而是填充您自己的类的实例,这个类像字符串一样嘎嘎叫,但会用额外的方法和状态等装饰。