Search code examples
ruby-on-railsruby-on-rails-4refactoringviewternary

Refactoring an address formatter in rails views (ternary, do .. if, etc?)


I have two examples that accomplish the same thing:

<% if @site.addresses %>
<% @site.addresses.each do |address| %>
<p> <%= address.primary_street + ' | ' if address.primary_street.present? -%>
    <%= address.secondary_street + ' | '  if address.secondary_street.present? -%>
    <%= address.city + ', ' if address.city.present? -%>
    <%= address.region -%>
    <%= ' ' + address.postal_code if address.postal_code.present? -%></p>
<% end %>
<% end %>

and

<% if @site.addresses %>
    <% @site.addresses.each do |address| %>
    <p><%= address.primary_street ? address.primary_street + ' | ' : nil -%>
        <%= address.secondary_street ? address.secondary_street + ' | '  : nil -%>
        <%= address.city ? address.city + ', ' : nil -%>
        <%= address.region ? address.region : nil -%>
        <%= address.postal_code ? ' ' + address.postal_code : nil -%></p>
    <% end %>
<% end %>

They both do exactly what I want, which is output formatted address data from the database. I will have some addresses that don't have street address, some that will have both primary and secondary, etc.

Is there a better, less repetitive way to do this... like the rails way?

For what it is worth this is a rails 4 app.


Solution

  • I suggest method is model.

    in addresss.rb

    def formatted_address
      fa = ""
      fa += primary_street    ? primary_street + ' | ' : ""
      fa += secondary_street  ? secondary_street + ' | '  : ""
      fa += city              ? city + ', ' : ""
      fa += region            ? region : ""
      fa += postal_code       ? ' ' + postal_code : ""
      fa
    end
    

    in view(you don't need to check @site.addresses isNil or isEmpty, because in this case not iterate)

    <% @site.addresses.each do |address| %>
       <p><%= address.formatted_address %></p>
    <% end %>