Визуализация частичного внутри цикла - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь сделать следующее частичное:

<% @accepted.each do |question| %>
  <div class="questions-container__content">
    <div class="questions-container__accepted-content">                 
      ...
    </div>  
    <%= render 'question_buttons', collection: @accepted %>
  </div>
<% end %>

с _question_buttons.html.erb:

<div class="links-container__button-group" id="link-buttons">
  <%= link_to "View submission", coin_question_path(question.coin, question.id), class: "primary-small","data-turbolinks"=>"false" %>
  <%= link_to "Edit", edit_coin_question_path(question.coin, question.id), class: "primary-small","data-turbolinks"=>"false" %>
  <% if !question.accepted? %>
    <%= link_to "Activate" , activate_coin_question_path(question.coin, question.id), class: "primary-small","data-turbolinks"=>"false" %>
  <% else %> 
    <%= link_to "Deactivate" , deactivate_coin_question_path(question.coin, question.id), class: "primary-small","data-turbolinks"=>"false" %>
  <% end %> 
  <% if current_user.admin? %>
    <%= link_to (question.rejected ? "Restore" : "Reject"), reject_coin_question_path(question.coin, question.id), class: "primary-small","data-turbolinks"=>"false" %>
  <% end %>
</div>

Я получаю следующую ошибку:

undefined local variable or method `question' for #<#<Class:0x00007fece6998d08>:0x00007fed02072bb8>

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Первый:

При рендеринге коллекции каждый элемент коллекции передается частичному в качестве локальной переменной с тем же именем, что и сам частичный. Это означает, что для этого звонка:

<%= render 'question_buttons', collection: @accepted %>

частичный question_buttons будет вызываться для каждого элемента массива @accepted; этот элемент будет доступен внутри частичного как question_buttons.

Если вы хотите использовать другое имя для элемента, например question, вам нужно назвать его как:

<%= render 'question_buttons', collection: @accepted, as: :question %>

Другой вариант - просто переименовать частичное в question:

<%= render 'question', collection: @accepted %>

Второе:

В вашем коде фрагмент рендеринга вызывается на каждой итерации цикла над @accepted элементами. Например, если @accepted имеет 8 элементов, частичное будет отображаться 8 раз для каждого из этих элементов, то есть 8 * 8 = 64 раза. Я подозреваю, что это не то, чего вы хотите достичь. Ваш код выглядит так, как будто question_buttons, часть должна отображаться для каждого элемента @accepted только один раз. В этом случае использование collection param здесь не имеет смысла. Просто передайте локальную переменную question в частичное:

<%= render 'question_buttons', question: question %>
0 голосов
/ 09 ноября 2018

Я считаю, что проблема заключается в том, что вам нужно передать переменную question из цикла each в родительском представлении в частичное с использованием locals, что позволяет частичному доступу к нему.

    <%= render 'question_buttons', locals: { question: question } %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...