我有一个名为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
答案 0 :(得分:1)
加入has_many关联为您提供的Foo#bar_ids
和Foo#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的当前小节。例如,它可能是系统中的所有条形图,在添加和删除您想要的任何条形图方面会更好。