Рефакторинг упрощает поддержку ваших представлений. Проблема заключается в том, чтобы выбрать, куда идет измененный код.
Вы можете выбрать частичные и помощники . Там нет каменных правил, предписывающих, где и где их следует использовать. Существует пара рекомендаций, в которых говорится, что помощники не должны содержать HTML.
Обычно партиалы лучше подходят для рефакторинга разделов, которые больше HTML / ERB / HAML, чем ruby. Помощники, с другой стороны, используются для фрагментов кода ruby с минимальным HTML или для генерации простого HTML из параметров.
Однако я не согласен с мнением о том, что помощники вообще не должны содержать HTML. Немного в порядке, просто не переусердствуйте. То, как обрабатываются помощники, затрудняет их использование для создания больших объемов HTML. Вот почему предполагается, что ваши помощники содержат минимальное количество HTML. Если вы посмотрите на источник помощников, которые поставляются с рельсами, вы заметите, что большинство из них генерируют html. Те немногие, которые этого не делают, в основном используются для генерации параметров и оценки общих условий.
Например, любой из помощников формы или вариантов link_to соответствуют первой форме помощников. В то время как такие вещи, как url_for и logged_in? как поставляются различные модели аутентификации второго типа.
Это цепочка решений, которую я использую, чтобы определить, следует ли выделять код из представления в частичное или вспомогательное.
- Повторяющиеся или почти идентичные операторы, создающие один неглубокий HTML-тег? => Помощник.
- Общее выражение используется в качестве аргумента для другого помощника? => Помощник.
- Длинное выражение (более 4 терминов) используется в качестве аргумента для другого помощника? => Помощник.
- 4 или более строк ruby (что не оценивается в HTML)? => Помощник.
- Практически все остальное => частичное.
В качестве примера я собираюсь использовать код, который вы ищете для рефакторинга:
Я бы изменил мнение в вопросе следующим образом:
приложение / хелперы / beast_helper.rb:
def beast_action(beast)
if beast.dead?
link_to "bury", bury_beast_path(beast)
else
link_to "kill!", kill_beast_path(beast)
end
end
приложение / просмотров / животные / _beast.html.erb:
<%= beast.body %>
<%= beast_action(beast) %>
приложение / просмотров / животные / index.html.erb:
<%= render :partial => "beast", :collection => @beasts %>
Технически это сложнее, потому что это 3 файла и всего 10 строк, а не 1 файл и 10 строк. Представления в настоящее время только 3 строки объединены в 2 файла. Конечный результат - ваш код намного более СУХОЙ. Позволяет вам повторно использовать части или все это в других контроллерах / действиях / представлениях с минимальной дополнительной сложностью.
Что касается идентификатора вашего тега тела. Вы действительно должны использовать content_for / yield. Для такого рода вещей.
приложение / просмотров / макеты / application.html.erb
...
<body id="<%= yield(:body_id) %>">
...
Приложение / просмотров / животные / index.html.erb
<% content_for :body_id, controller_action %>
...
Это позволит вам переопределить идентификатор тела в любом представлении, которое требует этого. Например:
приложение / просмотров / пользователей / preferences.html.erb
<% content_for :body_id, "my_preferences" %>