我正在使用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并进入渲染。
谢谢。
答案 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} %>