Rails标签(:br)不被认为是html_safe



最后回答

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

我想要的是一个换行符<br />,只有当值不是空的时候,所以,现在我这样写:

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

效果很好,但我相信有更少啰嗦的方法。

I tried:

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

==>华盛顿路" ## br标签不是html_safe .

如果我这样做:

<%= 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? %>

==>华盛顿路" ## br标签仍然不是html_safe .

消毒效果很好,像这样使用:

<%= 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

我在应用程序1中添加了这个helper。如果你想在你的应用程序中有一些不那么通用的东西,一个模块将是首选。

使用空参数的

Sanitize将检查字符串中的html,并删除它。如果你想要一些不那么重的东西,你可以使用h()来转义所有的html,而不是删除它。

在视图

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

我知道这纯粹是一个"写作速度问题",但任何帮助都会很感激。

亲切的问候

这不是因为你的br标签是安全的还是不安全的。

street字符串是不安全的,当你将一个安全字符串添加到一个不安全字符串时,结果仍然是不安全的。

可以写成

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

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

试一试:

<% 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的评论引起了我对xss attackhtml_safe相关的注意,我更新了答案并使用h来逃避,Frederick。我可以删除这个答案,但它也显示代码减少,所以也许它可以帮助别人。

最新更新