Ruby on rails ERb部分中的条件行距
这是我刚刚写的地址部分的代码。人们可能会将单行地址放在任一街道行中,公司名称是可选的,等等。。。它的工作方式正是我想要的,但我知道检查每个变量两次是丑陋和可怕的Ruby on rails ERb部分中的条件行距,ruby-on-rails,escaping,erb,Ruby On Rails,Escaping,Erb,这是我刚刚写的地址部分的代码。人们可能会将单行地址放在任一街道行中,公司名称是可选的,等等。。。它的工作方式正是我想要的,但我知道检查每个变量两次是丑陋和可怕的 <%= "#{a.name}" unless a.name.blank? %> <% unless a.name.blank? %> <br> <% end %> <%= "#{a.company_name}" unless a.company_name.blank? %&g
<%= "#{a.name}" unless a.name.blank? %>
<% unless a.name.blank? %> <br> <% end %>
<%= "#{a.company_name}" unless a.company_name.blank? %>
<% unless a.company_name.blank? %> <br> <% end %>
<%= "#{a.street_1}" unless a.street_1.blank? %>
<% unless a.street_1.blank? %> <br> <% end %>
<%= "#{a.street_2}" unless a.street_2.blank? %>
<% unless a.street_2.blank? %> <br> <% end %>
<%= "#{a.city}, #{a.state} #{a.zip}" %>
所以,我的免费使用,除非放在一边,我应该如何把有条件的换行
更新:
正如下面所讨论的,在用户输入时使用.html\u safe是危险的。如果您确实使用了下面建议的帮助器方法,则还必须在进入数据库的过程中清理所有用户输入。我将上面的代码改写为:
<% unless a.name.blank? %>
<%= a.name %>
<br>
<% end %>
<% unless a.company_name.blank? %>
<%= a.company_name %>
<br>
<% end %>
<% unless a.street_1.blank? %>
<%= a.street_1 %>
<br>
<% end %>
<% unless a.street_2.blank? %>
<%= a.street_2 %>
<br>
<% end %>
<%= "#{a.city}, #{a.state}" %> <%= a.zip %>
冗余检查只是我把事情复杂化了。我强烈建议不要在这种情况下使用.html_safe,因为这会给自己带来新的问题:清理输入,记住哪些字段是安全的。最好不要覆盖Rails提供的合理保护。有很多很多方法可以清理它,但是这里有一个合适的助手:
module ApplicationHelper
def format_address(a)
top = [a.name, a.company_name, a.street_1, a.street_2]
top.reject! {|s| s.blank?} # remove null and empty values
"#{top.join('<br/>')}#{a.city}, #{a.state} #{a.zip}".html_safe
end
end
那么在你看来,
<%= format_address(a) %>
这是否仍然存在转义或XSS问题?也许你可以加入newline并使用简单的格式…只有当值来自用户输入时。我会先清除HTML的所有值,然后再将它们保存到数据库中。OP表明它来自用户输入。当然,在没有额外消毒的情况下,不应使用这种方法。