我的模型中有一个描述文本字段。 不,我想在节目页面上添加此说明。 但由于没有换行,文本呈现丑陋。
如果我用<br/>
替换它们,那么铁轨就会逃脱它们。
所以我尝试使用raw()方法。
我想逃避错误的HTML,但在我的输出中有换行符。
我最终得到了一些丑陋的代码。
raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>"))
你有什么建议吗?
答案 0 :(得分:14)
你应该使用simple_format帮助器:
<%= simple_format @place.description %>
http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format
答案 1 :(得分:2)
是您正在寻找的
@place.description.html_safe.gsub("\n", '<br/>')
?但是,第二个想法,html_safe
这样的用法是否使网站很容易受到XSS攻击? (因为它假定description
是安全的)。
所以不会有更好的解决方案
<%= (h @place.description).gsub("\n", '<br/>') %>
起初我以为
<%= (h @place.description).gsub("\n", '<br/>'.html_safe) %>
是必需的,但实际上两个版本都有效。然后我通过向description
添加一些HTML标记进行测试,并将其转义为<
等,因此它可以防止XSS攻击。
答案 2 :(得分:2)
3年后,但提供一个好的工作解决方案永远不会太晚
这将转义所有HTML字符,但新行(兼容的Linux,Windows和Mac)
html_escape(@place.description).gsub(/(?:\n\r?|\r\n?)/, '<br />').html_safe
答案 3 :(得分:1)
这是一个有效的解决方案:
<%= sanitize(@place.description.gsub("\n", "<br />"), :tags => %w(br), :attributes => %w()) %>
更多阅读:
Parsing newline characters in textareas without allowing all html tags
文档:
http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html
来自消毒:
这个清理帮助程序将对所有标记进行html编码并删除所有未明确允许的属性。
它还会使用无效协议剥离href / src标记,例如javascript:尤其如此。它尽力抵制黑客可能使用的任何技巧,比如投入unicode / ascii / hex值来通过javascript:过滤器。查看广泛的测试套件。
您可以使用:tags选项指定允许的标签,使用:attributes选项指定属性。