Считается плохим тоном добавлять слишком много кода во view. Если этот код логически относится к контроллеру или модели то нет проблем - размещаете его там. Но иногда есть код чисто для представления. Например вам нужно отобразить список тэгов с локализацией.
I18n.t(tag, scope: "very.very.very.very.very.very.very.very.long.string.#{product.category}", default: tag.to_s.humanize)
Вы конечно можете разместить такой код в пердставлении
<%- product.tags.each do |tag| %>
<p>
<%= I18n.t(tag, scope: "very.very.very.very.very.very.very.very.long.string.#{product.category}", default: tag.to_s.humanize) %>
</p>
<%- end %>
А можно убрать его в хэлпер
def localized_tags(product)
product.tags.map do |tag|
I18n.t(tag, scope: "very.very.very.very.very.very.very.very.long.string.#{product.category}", default: tag.to_s.humanize)
end
end
И тогда вы получаете первое преимущество: читаемый код вьюхи
<%- localized_tags(product).each do |tag| %>
<p><%= tag %></p>
<%- end %>
И второе преимущество: вы можете переиспользовать localized_tags, написать на него тесты и т.п. И ваши модели и контроллеры не засоряются логикой представления.