最后回答。
我目前正在重构我的应用,而且我想知道如何缩短我的" 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;但任何帮助将不胜感激。
亲切的问候
答案 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
,我已更新答案并使用{{逃避,弗雷德里克。我可以删除这个答案,但它也显示代码减少,所以它可以帮助某人。