我有一个名为Feature
的模型,其中有一个称为body_string
的变量,其中包含我想要呈现的HTML标记,而不是转义。
每次在视图中引用body_string
时,都需要使用<%=raw
或.html_safe
。这似乎是多余的,也不那么枯燥。
有没有什么方法可以一劳永逸地将body_string
变量建立为html_safe
?
我假设这会发生在app/models/feature.rb
文件中,但我不知道正确的语法是什么。我想到了这个:
def body_string
return self.body_string.html_safe
end
但是Rails不喜欢它;它引发CCD_ 9异常。
当然,我可以定义一个不同名称的变量/方法:
def safe_body_string
return self.body_string.html_safe
end
然后将视图中的所有引用从body_string
更改为safe_body_string
。但不知何故,这似乎与最初简单地使用raw
或.html_safe
一样不枯燥。
对如何最好地处理这件事有什么见解吗?我觉得一定有什么非常优雅的东西,我只是没有看到。
只需使用read_attribute
即可避免对body_string
:的递归调用
def body_string
read_attribute(:body_string).html_safe
end
read_attribute
由write_attribute
补充,用于在模型中设置属性。
关于风格的注意事项:除非你真的需要,否则不要使用显式的return
。方法中最后一条语句的结果隐含地是从该方法返回的值。
虽然@pillary的答案肯定有效,但我认为这种逻辑不属于模型。这仅仅是因为它向模型层添加了视图级别的关注点(HTML安全性),模型层应该只包括业务逻辑。相反,我建议为此使用演示者(请参见http://nithinbekal.com/posts/rails-presenters/或者为它找一块宝石——我个人喜欢Display Case)。演示者可以轻松覆盖body_string
方法,并在视图中显示时提供.html_safe
名称。通过这种方式,您可以分离您的关注点,并可以继续从其他模型中获得body_string
,而无需在视图关注点中混合。
也许这个宝石对你有用。我还想在内容完全可信的情况下停止一直重复html_safe。
http://rubygems.org/gems/html_safe_attribute
或者您也可以使用这种方法,
def body_string
super && super.html_safe
end