将索引变量传递给fields_for标记和render部分内部

时间:2013-03-24 01:04:55

标签: ruby-on-rails cocoon-gem

我正在使用cocoon进行动态/嵌套字段/表单。

但是,我无法在部分文件中传递索引变量。

以下是我在_form.html.erb中的内容:

 <% @project_procurement_management_plan.items.each_with_index do |item, index | %>
  <%= f.fields_for :items, item, :child_index => index do |builder| %>
    <%= render 'item_fields', :f => builder, :g=>index %>
  <% end %>
<% end %>
<div>
  <%=link_to_add_association 'Add Item', f, :items, class:"btn btn-success totheleft" %>
</div>

在我的_item_fields.html.erb中:

<%= f.select :category_id, Category.all.map{ |c| [c.code, c.id] }, {:prompt=>""},{class:"cat-code #{g}",required:true} %>

它说:

未定义的局部变量或方法`g'代表#&lt;#:0x007f82dadeacd8&gt;

很明显,作为索引的变量g无法在我的部分中读取。

是否有任何变通方法可以将索引变量正确传递给fields_for并进入渲染。

谢谢。

3 个答案:

答案 0 :(得分:0)

您不必自己迭代这些项目! fields_for会为你做到这一点。

删除循环<% @project_procurement_management_plan.items.each_with_index do |item, index | %>

你现在还需要索引吗?

答案 1 :(得分:0)

请考虑使用“本地人”

<%= render :partial => 'item_fields', :locals => { :g => index, :f => builder } %>

答案 2 :(得分:0)

我通过设置一个@parameter就像这样解决了这个问题(haml):

questions.html.haml

- @answer_index = 0
.answers
  = f.fields_for :answers
  = f.link_to_add "Add an answer", :answers

answers.html.haml

.answer
  .field
    = f.label :answer, "Answer #{('A'..'Z').to_a[@answer_index]}"
    = f.radio_button :correct , 1, {onclick: "check_answer(this);"}
    = f.text_field :answer
    %span.remove
      = f.link_to_remove "remove"

- @answer_index += 1

不确定是否可以传递@answer_index

之类的@变量

所以对你来说它可能看起来像(但不完全是,我敢肯定):

_form.html.erb

  <%= @item_index = 0 %>
  <%= f.fields_for :items do |builder| %>
    <%= render 'item_fields', :f => builder %>
    <%= @item_index += 1 %>
  <% end %>
<% end %>
<div>
  <%=link_to_add_association 'Add Item', f, :items, class:"btn btn-success totheleft" %>
</div>

_item_fields.html.erb

<%= f.select :category_id, Category.all.map{ |c| [c.code, c.id] }, {:prompt=>""},{class:"cat-code #{@item_index}",required:true} %>