Rails:has_many:通过_ids嵌套?

时间:2011-05-05 17:18:25

标签: ruby-on-rails associations has-many

在一个页面上,我可能只有一个视频,然后复选框可以添加多个狗。很容易(如下)......

查看:

<%= check_box_tag "video[dog_ids][]", dog.id %>

控制器:

params[:video][:dog_ids] ||= []  

但我无法弄清楚该怎么做的是多个视频,每个视频都有多只狗。

我目前有这个:

<% @videos.each do |video| %>
  <%= fields_for "item[]", video do |f| %>
    <%= f.hidden_field :id, :index => nil %>
    <%= f.text_field :title, :index => nil%>
    <%= f.text_area :body, :index => nil %>

    <% video.dogs.each do |dog| %>
      <%= check_box_tag "item[][video[dog_ids][]]", dog.id %>
    <% end %>
  <% end %>
<% end %>

但是当我这样做时,dogs_ids在提交时总是nil

知道我做错了吗?

1 个答案:

答案 0 :(得分:2)

使用fields_for "item[]"f.text_field :title, :index => nil进行此类设置会产生:

<input id="item__name" name="item[][title]" size="30" type="text" value="vid1">

这表示复选框名称应为item[][dog_ids][]。 一个工作的例子:

<% @videos.each do |video| %>
  <%= fields_for "item[]", video do |f| %>
    <%= f.text_field :title, :index => nil %>
    <% video.dogs.each do |dog| %>
      <%= check_box_tag "item[][dog_ids][]", dog.id %> <%= Dog.name %>
    <% end %>
    <br>
  <% end %>
<% end %>

这会产生params的结果:

{"item"=> [
  {"title"=>"vid1", "dog_ids"=>["1", "2"]},
  {"title"=>"vid2", "dog_ids"=>["2"]},
  {"title"=>"vid3", "dog_ids"=>["2", "3"]}
]}