Как мне убрать этот беспорядок, используя content_tags? - PullRequest
0 голосов
/ 17 декабря 2011

У меня есть этот вспомогательный метод, который я не могу очистить с помощью 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 Ответ

2 голосов
/ 17 декабря 2011

Рассматривали ли вы перевести эту логику в частичное? Кроме того, вы должны использовать новый метод #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-безопасной семантикой по умолчанию.

Примечание : Если address1, address2 и т. Д. На самом деле nil и, возможно, не являются пустой строкой (по крайней мере, я подозреваю, что это верно для site.state), вы не нужно использовать present вообще. Просто скажите if site.state и назовите это днем. Методы present и presence просто обрабатывают пустые значения, как если бы они были nil для целей условных выражений.

...