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

时间:2015-11-12 16:01:48

标签: ruby-on-rails associations nested-attributes

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

我试过了:

富#修改

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的属性。相反,我希望能够通过列表foo.bars

添加/删除ids

1 个答案:

答案 0 :(得分:1)

加入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中你会得到像

这样的东西
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的当前小节。例如,它可能是系统中的所有条形图,在添加和删除您想要的任何条形图方面会更好。