使用fields_for可能是你最好的朋友
http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for
例如:我正在做的一个项目有食物,而食物可以有很多食物标签。管理这些标记的表单如下所示:
= food_form.fields_for "tags" do |tags_form|
- Tag.all.each_with_index do |tag, index|
= fields_for "#{type.downcase}[food_tags_attributes][#{index}]", food.food_tags.find_or_initialize_by_tag_id(tag.id) do |tag_form|
= tag_form.hidden_field :id
= tag_form.hidden_field :tag_id
= tag_form.check_box :_destroy, {:checked => tag_form.object.new_record? ? false: true}, "0", "1"
= tag_form.label :_destroy, tag.display_name + " #{}"
注意,我使用的是反向的_destroy属性。因此,如果选中该框,它将添加,如果未选中,它将在food.update_attributes上删除它。