我想实现在嵌套形式的HABTM复选框。
目前,我有3种型号。 学科,课程和团体。 该协会如下:每个主题都有很多教训。 每节课都有属于多个组。
现在,我想实现所有单创建和编辑表单。 这样的教训嵌套在主题和每课有落实HABTM关系组复选框的列表。
我对着实现HABTM关系的麻烦,因为有每个科目很多教训,我不知道我怎么可以在不同的经验教训加以区分。
为了进一步阐述,我能够得到嵌套形式的工作,但我不能让HABTM复选框保存到正确的教训。 下面的代码示例是我HABTM复选框实现。
<% Group.all.each do |group|%>
<%= check_box_tag "subject[lessons_attributes[0]][group_ids][]", group.id, f.object.groups.include?(group) %>
<%= group.group_index %>
<%end%>
目前,我一直在使用这一行“主题[lessons_attributes [0] [group_ids] []”它保存到的第一课。
然而,经验教训的数量各不相同,我也不太清楚,我怎么能确定的教训“数字”,在“主题[lessons_attributes [0] [group_ids] []”,即粗体0。 这样我可以在群保存到正确的教训。
任何意见,将不胜感激。
最好的做法是预生成的主题(几)课程对象(也就是form.object),那么你遍历他们有每节课领域。 如果你使用simple_form或formtastic ,收集通过复选框选择很简单:
<% form_for @subject do |form| %>
....
<% form.fields_for :lessons do |lesson_form| %>
...
<% lesson_form.input :group_ids, :as => :check_boxes %>
如果你想使用check_box_tag
,你应该通过经验与索引迭代,并在您的复选框名称来替代指数:
<% form_for @subject do |form| %>
....
<% @subject.lessons.each_with_index do |l, i| %>
<% Group.all.each do |group|%>
<%= check_box_tag "subject[lessons_attributes[#{i}]][group_ids][]", group.id, l.groups.include?(group) %>
<%= group.group_index %>
<% end %>
对于那些使用Rails 4个工作并具有相同的问题(像我)
该Group.all.each
环路@Viktor TRON的回答是不必要的:有一个新的FormBuilder方法, collection_check_boxes ,这已经创造了只为那!
您的代码将是:
<% form_for @subject do |form| %>
....
<% @subject.lessons.each_with_index do |l, i| %>
<%= form.fields_for :lessons, l do |lesson_fields|%>
<%= lesson_fields.collection_check_boxes :group_ids, Group.all, :id, :group_index %>
<% end %>
<% end %>
<% end %>
然后,您必须添加accepts_nested_attributes_for :lessons
你的Subject
模式,并在您的SubjectsController
,改变subject_params
法“允许”嵌套params用于在教训:
params.require(:subject).permit(..., lessons_attributes: [:id, group_ids: []])
在你SubjectsController
,在create
或update
操作保持不变: @subject = Subject.create(subject_params)
例如,将创建主题,相关的经验教训,正确地更新他们的HABTM关系到组(除非我什么地方搞错了!)。