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} &nbsp; #{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}" %> &nbsp; <%= 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} &nbsp; #{a.zip}".html_safe
  end
end 
那么在你看来,

<%= format_address(a) %>

这是否仍然存在转义或XSS问题?也许你可以加入newline并使用简单的格式…只有当值来自用户输入时。我会先清除HTML的所有值,然后再将它们保存到数据库中。OP表明它来自用户输入。当然,在没有额外消毒的情况下,不应使用这种方法。