Направляющие: partials должен знать о переменных экземпляра?

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

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) имеет partials переменные экземпляра доступа или 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's name is <%= son.name %>
The dad's name is <%= son.dad.name %>

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

Надо надеяться, это имело некоторый смысл. Поиск некоторого понимания этой целой вещи... Спасибо!

63
задан Alexandre 23 March 2010 в 21:41
поделиться

2 ответа

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

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

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

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

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

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

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

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

  3. Если часть будет совместно использоваться несколькими контроллерами, используйте только локальные переменные.

В любом случае это то, что мне подходит.

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

103
ответ дан 24 November 2019 в 16:12
поделиться

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

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

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

3
ответ дан 24 November 2019 в 16:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: