Использование помощников Rails для частичной обработки

С моей точки зрения, помощники в основном используются для очистки просмотров из определенной логики, ориентированной на определенный вид.

Но в моем новом проекте (устаревшем приложении) я наткнулся на множество помощников, которые выглядят так:

def itemprepare
  render :partial => 'items/itemlist_summary'
end

Это правильно? Оказание частичного мне похоже на то, что вы хотели бы сделать в представлении, поскольку оно не включает в себя какую-либо логику, которая должна быть абстрагирована.

Должен ли я просто вставить все эти помощники?

Ответ 1

Рендеринг частичного не принадлежит помощнику. Помощники должны помочь вам делать то, что содержит логику. Логика не принадлежит контроллеру, если только логика не делает частичные части и не решает, что-то должно отображаться или нет.

Ответ 2

Хотя вы вообще не должны использовать вспомогательные методы для рендеринга частичных элементов, я могу видеть, как в некоторых ситуациях может потребоваться. Для этих обстоятельств вам необходимо использовать метод concat:

def itemprepare
  concat(render(:partial => 'items/itemlist_summary'))
end

Ответ 3

Подобно Ajedi32 говорит, что частичное использование относится к представлениям, но иногда полезно использовать их в помощниках. Я надеюсь, что полезно показать, что я сделал в своем приложении:

Я следил за отличной статьей Мысли о Rails Helper, чтобы помочь DRY нашему представлению. Я использую JQuery Mobile с фиксированным заголовком, навигационной панелью, навигационной панелью и нижним колонтитулом.

На каждой странице мне нужно включить нижний колонтитул и панель навигации, поэтому обычно это было бы:

  <div data-role="footer">
    <h4>Page Footer</h4>
  </div><!-- /footer -->
  <%= render "shared/nav_panel" %>
</div><!-- /page -->

в конце каждой страницы.

Затем я реорганизовал рендеринг в помощнике приложения, и теперь он:

  # app/helpers/application_helper.rb
  def page_footer
    footer = content_tag :div , :"data-role" => "footer" do
      content_tag :h4, "Page Footer"
    end
    nav_panel = render(:partial => 'shared/nav_panel')
    footer + nav_panel
  end

и в представлении, которое я просто вызываю:

<%= page_footer %>

Это лишь краткий пример; в действительности приложение имеет нижний колонтитул, который изменяется в соответствии с зарегистрированным статусом, языком пользователя и т.д.

Ответ 4

У нас есть пара помощников, подобных этому в нашем проекте, но большинство из них находятся в нашем обычном драгоценном камне. Обтекание частичного рендеринга с помощью хелпера не позволяет приложению узнать, как визуализируется информация, и мы можем легко расширить логику, изменить частичную или сделать все, что захотим внутри этого помощника, пока оно запрашивает часть представления. Иногда эти частичные требуют некоторых данных, которые находятся внутри самого драгоценного камня, и нет необходимости раскрывать его в приложении. Поэтому приложение вызывает вспомогательный метод (иногда без каких-либо параметров), который формирует требуемые параметры и locals и передает их частичным.

Но когда вы просто отдаете частичное внутри своего приложения, и вам не нужна какая-либо обширная логика в этом рендеринге, я не думаю, что там много пользы от создания нового помощника для каждого частичного.