在循环内渲染局部

时间:2018-11-09 00:05:45

标签: ruby-on-rails

我正在尝试渲染以下部分内容:

<% @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 :(得分:1)

我认为问题在于,您需要使用questioneach变量从父视图中的locals循环传递到局部变量,该变量允许局部变量对其进行访问。 / p>

    <%= render 'question_buttons', locals: { question: question } %>

答案 1 :(得分:0)

第一

渲染集合时,集合的每个项目都作为局部变量传递给局部变量,该局部变量与局部变量本身具有相同的名称。这意味着该调用:

<%= 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参数在这里没有意义。只需将局部变量question传递给局部变量:

<%= render 'question_buttons', question: question %>