Rails标记(:br)不被视为html_safe

时间:2014-08-02 15:56:30

标签: ruby-on-rails string if-statement tags html-safe

最后回答。

我目前正在重构我的应用,而且我想知道如何缩短我的" if"因为我在其中使用了很多:

我想要的是,仅当值不是空白时才会换行<br />,所以,现在我这样写:

<% if @card.address.street.present? %>
 <%= @card.address.street.titleize %>
 <%= tag(:br) %> ## or plain html <br />
<% end %>

效果很好,但我确信有一种不那么冗长的方式。

我试过了:

<%= @card.address.street.titleize + tag(:br) if @card.address.street.present? %>

==&GT;华盛顿路&#39;&#39; ## br标签ain&#t; html_safed。

如果我这样做:

<%= raw @card.address.street.titleize + tag(:br) if @card.address.street.present? %>

等于:

<%== @card.address.street.titleize + tag(:br) if @card.address.street.present? %>

我运作良好,但将我的代码暴露给XSS攻击。

所以,我试过了:

<%= @card.address.street.titleize + raw(tag(:br)) if @card.address.street.present? %>

<%= @card.address.street.titleize + tag(:br).html_safe if @card.address.street.present? %>

<%= @card.address.street.titleize + "<br />".html_safe if @card.address.street.present? %>

==&GT;华盛顿路&#39;&#39; ## br标签仍然是atml&h; html_safed。

Sanitize给出了很好的结果,就像这样使用:

<%= sanitize(@card.address.street.titleize + tag(:br)) if @card.address.street.present? %>

但这是关于表现的最佳方式吗?

我最终使用了帮手:

内部助手/ application_helper

def line_break value
 sanitize(value) + tag(:br)
end

Helper加载到控制器

class UsersController < ApplicationController
helper ApplicationHelper

我在应用程序中添加了这个助手。如果你想在你的应用上不那么通用,那么首选模块。

与空参数一起使用的清理将检查字符串中的html,并将其删除。 如果你想要一些不那么重的东西,你可以使用h()来逃避所有html而不是删除它。

在视图中

<%= line_break(@card.address.street.titleize) if @card.address.street.present? %>

我知道这纯粹是一个&#34;写作速度问题&#34;但任何帮助将不胜感激。

亲切的问候

2 个答案:

答案 0 :(得分:1)

这不是因为您的br标签安全或不安全。

街道字符串不安全,当您向不安全的字符串添加安全字符串时,结果仍然不安全。

您可以将其写为

<%= h(@card.address.street.titleize) + tag(:br) %>

h执行转义并将结果标记为安全(因为它刚刚被转义)。

答案 1 :(得分:0)

尝试一下:

<% street = @card.address.street %>
<%= h(street.titleize) + tag(:br) if street.present? %>

OR(不太可读但紧凑)

<%= (h(street.titleize) + tag(:br)) if ((street = @card.address.street) && street.present?) %>

祝你好运!

修改:由于Frederick Cheung comment将注意力转移到与xss attack相关联的html_safe,我已更新答案并使用{{逃避,弗雷德里克。我可以删除这个答案,但它也显示代码减少,所以它可以帮助某人。