【发布时间】:2014-08-02 15:56:30
【问题描述】:
最后回答。
我目前正在重构我的应用程序,我想知道如何缩短我的“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 对此有很好的效果,这样使用:
<%= sanitize(@card.address.street.titleize + tag(:br)) if @card.address.street.present? %>
但这是提高性能的最佳方式吗?
我最终使用了一个助手:
在 helpers/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? %>
我知道这纯粹是“写作速度问题”,但我们将不胜感激。
亲切的问候
【问题讨论】:
-
无论如何这应该在一个助手中。
-
当然戴夫,我会使用一个助手。我的问题主要是
没有转义,即使我做了一个帮手,比如 line_break(@card.address.street.titleize) 和 def line_break(value) value + tag(:br) end
标签: ruby-on-rails string if-statement tags html-safe