Rails坚持验证

时间:2017-04-12 18:02:04

标签: ruby-on-rails ruby validation

我有一个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

然后它仍然可以正确替换,但替换的值将被持久化(即数据库包含“哦我的****”),这对我来说没有多大意义。似乎验证器正在改变它验证的字段。

有没有办法保留验证,但是没有它保持访问者返回的值?

1 个答案:

答案 0 :(得分:1)

确定您没有在 profanity_filter 实现中设置属性值,您只是返回它的过滤副本(只是验证属性不应该更改它的值,除非您是意外的还在profanity_filter方法中设置其值。

此外,我还会改变你在你定义的宏中所做的一点,而不是

define_method(attr)

我将方法定义为

define_method("#{attr}_clean")

并在视图中通过调用“干净”版本来访问属性的过滤版本,即

<%= post.body_clean %>
相关问题