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.: Просто подумал об этом - на самом деле вы можете абстрагироваться от того, как вы называете частичным в вспомогательном методе, поэтому, если способ, которым вы называете частичное, нужно изменить - тогда вам просто нужно изменить одно место.