如何处理多选复选框中的条目删除

时间:2013-01-10 06:42:14

标签: ruby-on-rails

这是对此处提出的问题的继续

How to add one-to-many objects to the parent object using ActiveRecord

class Foo < ActiveRecord::Base
  has_many :foo_bars
end

class Bar < ActiveRecord::Base
end  

class FooBar < ActiveRecord::Base
  belongs_to :foo
  belongs_to :bar
end 

如何处理多选复选框中的条目删除用于表示一对多实体。我可以添加或更新条目,但删除似乎失败,因为 foo_id 似乎是空的,查询似乎是更新而不是删除。

编辑

我使用以下代码尝试了@charlysisto建议

我的控制器代码如下:

  class Foo < ActiveRecord::Base
    has_many :foo_bars
    has_many :bars, :through => :foo_bars
  end

   def edit
    @foo = Foo.find(params[:id])
    @sites = Site.where(company_id: @current_user.company_id).all
   end

  def update
    @foo = Foo.find(params[:id])

    if @foo.update_attributes(params[:foo])
      flash[:notice] = "Foo was successfully updated"
      redirect_to foos_path
    else
      render :action => 'edit'
    end
   end

查看代码如下:

<% @bars.each do |bar| %>
    <%= check_box_tag 'bar_ids[]', bar.id %>
    <%= bar.name %>
<% end %>

所以我尝试了这些更改,但是如果我删除了一条记录,foo_bars似乎仍然没有反映出这些更改。

1 个答案:

答案 0 :(得分:3)

您的协会缺少的是:

class Foo < ActiveRecord::Base
  has_many :bars, :through => :foo_bars
end

... has_many(或has_many:through)宏为您提供了大量的方法,包括bar_idsbar_ids= [...]

所以你需要在你的视图/控制器中做的就是:

# edit.html.haml which will send an array of bar_ids
=f.select :bar_ids, Bar.all.map {|b| [b.name, b.id]}, {}, :multiple => true

# foo_controller
@foo.update_attributes(params[:foo])

就是这样!无需在FooController#update ...

中手动设置或删除关联