Зачем нужны хелперы в контексте контроллеров/вью?
Считается плохим тоном добавлять слишком много кода во 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, написать на него тесты и т.п. И ваши модели и контроллеры не засоряются логикой представления.
Точно не скажу, зачем они нужны в контроллерах, но вот в вьюхах они нужны для того, чтобы заранее определить какую-то функцию, чтобы использовать ее во вьюхе.
Думаю, в контроллере также, но для меня удобнее просто определить новый метод и использовать его как хелпер.