0

最后回答。

我目前正在重构我的应用程序,我想知道如何缩短我的“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? %>

==> Washington Road '' ## br 标签不是 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? %>

==> Washington Road '' ## br 标签仍然不是 html_safed。

消毒对此有很好的效果,像这样使用:

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

但这是关于性能的最佳方式吗?

我最终使用了一个助手:

内部助手/application_helper

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

助手加载在控制器内

class UsersController < ApplicationController
helper ApplicationHelper

我在应用程序一中添加了这个助手。如果您希望在您的应用程序上使用不那么通用的东西,则首选模块。

与空参数一起使用的消毒将检查字符串中的 html,并将其删除。如果您想要不那么重的东西,您可以使用h()它将转义所有 html 而不是删除它。

在视图中

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

我知道这纯粹是一个“写作速度问题”,但我们将不胜感激。

亲切的问候

4

2 回答 2

1

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

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

您可以改为将其写为

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

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

于 2014-08-02T20:17:52.307 回答
0

试试看:

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

或(可读性较差但紧凑)

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

祝你好运!

编辑:由于 Frederick Cheung 的评论让我注意到与xss attack相关联html_safe,我已经更新了答案并h用于逃生,Frederick。我可以删除这个答案,但它也显示代码减少,所以它可能对某人有帮助。

于 2014-08-02T16:30:17.697 回答