У вас есть несколько вариантов, это зависит от обстоятельств.
Вы не хотите поместить текст просмотра в контроллер. Нет @filter_link_text
. Контроллер соединяет модели с видами. Представление управляет тем, как все отображается.
Самое простое - это то, что вы уже предложили, контроллер устанавливает флаг, который использует представление.
<% if @offer_filter %>
<%= link_to 'With filter', polymorphic_path(@thing, { filtered: 1 }) %>
<% else %>
<%= link_to 'Without filter', polymorphic_path(@thing, {}) %>
<% end %>
Затем вы можете переместить это в парциальное . Переместите код в app/views/shared/_filtered_thing.html.erb
и отобразите его в своем представлении. Это упрощает ваше представление и позволяет совместно использовать код представления.
<%= render 'shared/filtered_thing' %>
Средним шагом является использование декоратора . Декоратор - это тонкая обертка вокруг модели, которая позволяет добавлять и изменять ее поведение, определяя c для определенного использования. Это позволяет избежать насыщения модели множеством представлений.
draper
реализует декораторы и хорошо связывается с Rails. Он использует очень похожую проблему в качестве примера.
class ThingDecorator < Draper::Decorator
delegate_all
def filter_toggle_link(filtered)
if filtered
# h allows access to the Rails helper methods
h.link_to 'With filter', h.polymorphic_path(self, { filtered: 1 })
else
h.link_to 'Without filter', h.polymorphic_path(self, {})
end
end
end
Теперь ваше представление вызывает этот метод для декорированного объекта.
<%= @thing.filter_toggle_link(@offer_filter) %>
Вы также можете добавить флаги в ваш декоратор. Например, если вам нужно установить фильтр для каждого объекта.
class ThingDecorator < Draper::Decorator
delegate_all
attr_accessor :filtered
def filter_toggle_link
if filtered?
# h allows access to the Rails helper methods
h.link_to 'With filter', h.polymorphic_path(self, { filtered: 1 })
else
h.link_to 'Without filter', h.polymorphic_path(self, {})
end
end
def filtered?
filtered
end
end
# In the controller
@thing.filtered = true
# In the view
<%= @thing.filter_toggle_link %>
Большое преимущество декоратора перед частичным представлением состоит в том, что вы можете модульно протестировать декоратор.
Открываются партиалы и декораторы больше способов сохранить ваши логики вида c хорошо продуманными и не допустить вздутие ваших контроллеров и моделей.