Rails: Должны ли частичные данные учитывать переменные экземпляра?

Ryan Bates 'nifty_scaffolding, например, делает это

edit.html.erb

<%= render :partial => 'form' %>

new.html.erb

<%= render :partial => 'form' %>

_form.html.erb

<%= form_for @some_object_defined_in_action %>

Это скрытое состояние заставляет меня чувствовать себя некомфортно, поэтому мне обычно нравится это делать

edit.html.erb

<%= render :partial => 'form', :locals => { :object => @my_object } %>

_form.html.erb

<%= form_for object %>

Итак, что лучше: a) иметь частичные экземпляры экземпляров доступа или b) передавать частичные все необходимые ему переменные

Я выбрал b) в последнее время, но я столкнулся с небольшим рассолом:

some_action.html.erb

<% @dad.sons.each do |a_son| %>
<%= render :partial => 'partial', :locals => { :son => a_son } %>
<% end %>

_partial.html.erb

The son name is <%= son.name %>
The dad name is <%= son.dad.name %>

son.dad делает вызов базы данных для извлечения папы! Таким образом, я либо должен был бы получить доступ к @dad, который вернется к a), имея частичные экземпляры экземпляров доступа, или мне придется передавать @dad в locals, изменяя render: partial to <% = render: partial = > 'partial',: locals = > {: dad = > @dad,: son = > a_son}% > , и по какой-то причине передача кучи vars в мою частицу заставляет меня чувствовать себя некомфортно, Возможно, другие тоже так чувствуют себя.

Надеюсь, это имело какой-то смысл. Ищете некоторое понимание всей этой вещи... Спасибо!

Ответ 1

В последних версиях Rails довольно легко сделать частичные и передать местным пользователям. Вместо этого.

<%= render :partial => 'form', :locals => { :item => @item } %>

Вы можете сделать это.

<%= render 'form', :item => @item %>

Я не делаю этого в генераторе Nifty Scaffold, чтобы поддерживать обратную совместимость, но я изменю это в будущей версии.

Что касается допустимости использования переменных экземпляра в частичных. Я думаю, что это. По всем практическим соображениям, каков недостаток? Конечно, все может выйти из-под контроля, если вы несовместимы, но мне нравится применять эти рекомендации.

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

  • Если частичное имя совпадает с именем ресурса, передайте его как локальный с <%= render @item %>.

  • Если частичное будет разделяться между несколькими контроллерами, тогда используйте только локали.

Это то, что хорошо работает для меня в любом случае.

Бонусный совет:, если вы обнаружите, что проходите много мест в частичном, и вы хотите, чтобы некоторые из них были необязательными, создайте вспомогательный метод, который отображает частичное. Затем всегда выполняйте вспомогательный метод, чтобы вы могли сделать чистый интерфейс с необязательными аргументами для частичного отображения.

Ответ 2

Использование @instance_variables в partials - плохой дизайн.

Использование переменной экземпляра в partials работает, но это может затруднить поддержку приложений, если изменения когда-либо необходимы.

Недостатком использования переменных экземпляра в partials является то, что вы создаете зависимость в частичном чем-то вне частичной области (связи). Это делает частичную сложность повторного использования и может принудительно изменять изменения в нескольких частях приложения, когда вы хотите внести изменения в одну часть.

Частицы, использующие переменные экземпляра:

  • должен измениться, когда переменная экземпляра в любом контроллере, который использует частичные изменения, либо имя переменной экземпляра, либо его тип или структуру данных
  • вызывают все действия контроллера, которые используют частичное изменение таким же образом, в то же время, когда есть изменения в том, как используется переменная экземпляра
  • препятствовать повторному использованию, поскольку их можно просто повторно использовать в действиях, которые устанавливают переменные экземпляра с тем же именем и данными

Вместо этого передайте locals частичным:

<%= render 'reusable_partial', :item => @item %>

Теперь, поскольку частичные ссылки item, а не @item, действие, которое отображает представление, которое отображает reusable_partial, может свободно меняться, не затрагивая повторно используемые_партийные и другие действия/представления, которые его отображают:

<%= render 'reusable_partial', :item => @other_object.item %>

Кроме того, это можно использовать повторно в контекстах, где нет @item:

<%= render 'reusable_partial', :item => @duck %>

Если my @duck изменится в будущем и больше не будет крякать, как reusable_partial ожидает его (изменение интерфейса объекта), я также могу использовать адаптер для передачи в виде элемента, который ожидает reusable_partial:

<%= render 'reusable_partial', :item => itemlike_duck(@duck) %>

Всегда?

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

Таким образом, это обеспечивает хорошую общую практику при относительно низкой стоимости.

Ответ 3

Вы можете иметь это в обоих направлениях. В верхней части частичного:

<% item ||= @item %>

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

Ответ 4

Я проголосую за a) по очень определенной причине - СУХОЙ! Если вы начнете передавать переменную - вот так - следующее, что вы знаете - это беспорядок - скажем, вам нужно изменить способ присвоения переменной или что-то еще об этом - тогда вам нужно перейти ко всем своим взглядам и изменить их вместо ОДНОГО частичного. Кроме того, если вы измените частичное - пусть говорят, что он создает таблицу с некоторым результатом, она изменится во всех ваших представлениях, поэтому вам нужно будет знать, какие представления используются, правильная среда IDE должна помочь вам в этом, но мне также нравится иметь небольшую секцию комментариев в верхней части представления - где я просто упоминаю, где она используется и почему - помогает другому программисту, и это помогает вам запомнить, если вам нужно вернуться к частичной и изменить. Но все, что нужно для частичного, это назвать его БЕЗ необходимости передавать что-либо из представления, так что вам не нужно изменять все места, из которых вызывается частичное, если какая-то переменная каким-то образом изменится.

В конечном счете это выбор дизайна - и, честно говоря, если вы используете фейсбук, то дополнительный поиск, который вы делаете, не так уж и сложный, но он просто не очень СУХОЙ.

P.S.: Просто подумал об этом - на самом деле вы можете абстрагироваться от того, как вы называете частичным в вспомогательном методе, поэтому, если способ, которым вы называете частичное, нужно изменить - тогда вам просто нужно изменить одно место.