最后回答。
我目前正在重构我的应用程序,我想知道如何缩短我的“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? %>
我知道这纯粹是一个“写作速度问题”,但我们将不胜感激。
亲切的问候