轨道上的红宝石 - 有没有办法像往常一样定义模型的属性html_safe?



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

相关内容

  • 没有找到相关文章

最新更新