我有一个ActiveRecord模型,它在调用其访问器时找到并替换属性上的过滤,我就像我的问题here的答案一样。它看起来像这样:
class Post < ActiveRecord::Base
include Replaceable
profanity_attrs :body, :title
end
如果您没有查看该链接,那么会有一个名为profanity_attrs的宏调用profanity_filter方法,该方法可以找到/替换已知关键字。
所以,当我有body = "Oh my poop"
这样的东西时,我会用****替换,以便过滤器返回“哦我的****”,那就是它的样子,我很开心。数据库显示“哦我的大便”,视图显示“我的****”,这正是我想要的,直到...我添加验证。所以,如果我这样做:
class Post < ActiveRecord::Base
include Replaceable
validates :body, length: { maximum: 255 }
profanity_attrs :body, :title
end
然后它仍然可以正确替换,但替换的值将被持久化(即数据库包含“哦我的****”),这对我来说没有多大意义。似乎验证器正在改变它验证的字段。
有没有办法保留验证,但是没有它保持访问者返回的值?
答案 0 :(得分:1)
确定您没有在 profanity_filter 实现中设置属性值,您只是返回它的过滤副本(只是验证属性不应该更改它的值,除非您是意外的还在profanity_filter方法中设置其值。
此外,我还会改变你在你定义的宏中所做的一点,而不是
define_method(attr)
我将方法定义为
define_method("#{attr}_clean")
并在视图中通过调用“干净”版本来访问属性的过滤版本,即
<%= post.body_clean %>