如何使用content_tags清理这个混乱?

时间:2011-12-17 18:06:58

标签: formatting ruby-on-rails-3.1

我有这个帮助方法,似乎无法使用content_tag中的Rails 3.1进行清理

def site_address(site)
    html = '<address>'    
    html += site.address1 if site.address1.present?
    html += tag(:br) + site.address2 if site.address2.present?
    html += tag(:br) + site.city + ', ' if site.city.present?
    html += site.state.statecode if site.state.present?
    html += ' ' + site.zipcode if site.zipcode.present?
    html += '</address>'

    html.html_safe
end

如果我尝试使用content_tag(:address) do....然后将内容放入块中,它就会转移我的<br />标记。

另请注意,有很多if.present?逻辑,因为该表可以有一堆空值。

由于

1 个答案:

答案 0 :(得分:2)

您是否考虑将此逻辑转换为部分逻辑?此外,您应该使用新的#presence方法。

首先,方法:

def site_address(site)
  address = [
    site.address1.presence,
    site.address2.presence
  ].compact

  location = ""
  location << site.city << ", " if site.city.present?
  location << site.state.statecode if site.state.present?
  location << site.zipcode if site.zipcode.present?

  render :partial => "shared/site_address",
         :locals => { :address_lines => address, :location => location }
end

然后,部分:

<address>
  <% address_lines.each do |line| %>
    <%= line %><br>
  <% end %>
  <%= location %>
</address>

一般情况下,在帮助程序中使用html_safe提示您可能会在帮助程序中过度使用HTML逻辑,并且最好还是使用模板引擎,这样可以让您获得更多帮助轻松混合静态和动态内容与良好的默认XSS安全语义。

注意:如果address1address2等实际上是nil,而且可能不是空字符串(我怀疑这是关于网站的。状态,至少),您根本不需要使用present。只需说出if site.state并称之为一天。为了条件限制,presentpresence方法只是将空值视为nil