这次是讲多对多情况下的编辑,我们使用Checkbox来完成该工作:
[code]
class Category < ActiveRecord::Base
has_and_belongs_to_many :products
end
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
end
[/code]
上面Category和Product是多对多的关系,下面我们来写Product编辑页面:
[code]
<%= error_messages_for 'product' %>
<p>
Name<br/>
<%= text_field :product, :name %>
</p>
<p>
Price<br/>
<%= text_field :product, :price %>
</p>
<p>
<% for category in Category.find(:all) %>
<div>
<%= check_box_tag "product[category_ids][]", category.id, @product.categories.include?(category) %>
<%= category.name %>
</div>
<% end %>
</p>
[/code]
可以看到,我们用check_box_tag来编辑Product的categories
而category_ids属性是Product的has_and_belongs_to_many自动生成的
下面再看ProductsController的update方法代码:
[code]
def update
params[:product][:category_ids] ||= []
@product = Product.find(params[:id])
if @product.update_attributes(params[:product])
flash[:notice] = 'Product was successfully updated.'
redirect_to :action => 'show', :id => @product
else
render :action => 'edit'
end
end
[/code]
留意一下,update方法需要先使用params[:product][:category_ids] ||= []来将category_ids清空
不然当我们取消所有的category Checkbox时,后台sql不会传递空的category_ids数组,而是不传递category_ids参数
这样会导致取消不了category Checkbox。
[code]
class Category < ActiveRecord::Base
has_and_belongs_to_many :products
end
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
end
[/code]
上面Category和Product是多对多的关系,下面我们来写Product编辑页面:
[code]
<%= error_messages_for 'product' %>
<p>
Name<br/>
<%= text_field :product, :name %>
</p>
<p>
Price<br/>
<%= text_field :product, :price %>
</p>
<p>
<% for category in Category.find(:all) %>
<div>
<%= check_box_tag "product[category_ids][]", category.id, @product.categories.include?(category) %>
<%= category.name %>
</div>
<% end %>
</p>
[/code]
可以看到,我们用check_box_tag来编辑Product的categories
而category_ids属性是Product的has_and_belongs_to_many自动生成的
下面再看ProductsController的update方法代码:
[code]
def update
params[:product][:category_ids] ||= []
@product = Product.find(params[:id])
if @product.update_attributes(params[:product])
flash[:notice] = 'Product was successfully updated.'
redirect_to :action => 'show', :id => @product
else
render :action => 'edit'
end
end
[/code]
留意一下,update方法需要先使用params[:product][:category_ids] ||= []来将category_ids清空
不然当我们取消所有的category Checkbox时,后台sql不会传递空的category_ids数组,而是不传递category_ids参数
这样会导致取消不了category Checkbox。
多对多编辑
本文介绍如何使用Checkbox处理多对多关系中的编辑操作,通过Category和Product模型实现,并展示了具体的Rails代码实现。

被折叠的 条评论
为什么被折叠?



