列表和更新关联 ID - Rails 4,Form_for

Listings and Updating Associated IDs - Rails 4, Form_for

我有一个模型叫Foo,里面有很多bars。我希望能够通过添加或删除关联的 foo.bars.ids 来添加/删除 foo.bars。我怎样才能做到这一点?

我试过了:

Foo#编辑

def edit
  @bars = @foo.bars
end

表格

<%= form_for @foo, url: edit_foo_path(@foo.id) do |p| %>
  ...
  <%= p.text_area @bars %> #<= returns undefined method `Collection..' for `foo`
  ...
  <%= p.fields_for @foo.bars do |b| %>
    <%= b.text_area :ids %> #<= returns in 'unpermitted param 'bar' on #update' 
  <% end %>
  ...
<% end %>

我想 fields_for 无论如何都不能在这里工作,因为我没有更新 bar 的属性。相反,我希望能够通过列出他们的 ids

添加/删除 foo.bars

连接到 has_many 协会为您提供的 Foo#bar_idsFoo#bar_ids= 方法。例如,您可以通过复选框来执行此操作。

<% form_for @foo do |f| %>
  <% @bars.each do |bar| %>
    <div class="bar--checkbox">
      <%= check_box_tag "foo[bar_ids]", bar.id, @foo.bar_ids.include?(bar.id) %>
      <%= bar.name %>
    </div>
  <% end %>
  <%= f.submit "Save" %>
<% end %>

现在,在参数中你会得到类似

的东西
params = {:id => 123, :foo => {:bar_ids => [1, 5, 8, 10]})

您可以执行通常的更新控制器代码:

@foo = Foo.where(:id => params[:id])
@updated = @foo.update_attributes(params[:foo])

这就像这样做:

@foo.bar_ids = [1, 5, 8, 10]
@foo.save

注意 - 在您的代码中,您将@bars 设置为@foo 的当前柱。例如,它可以是系统中的所有条形图,就添加和删除您想要的任何条形图而言会更好。