最后回答
我目前正在重构我的应用程序,我想知道如何缩短我的"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 attack
与html_safe
相关的注意,我更新了答案并使用h
来逃避,Frederick。我可以删除这个答案,但它也显示代码减少,所以也许它可以帮助别人。