Rails宝典之第十七式: 多对多Checkbox编辑

多对多编辑
本文介绍如何使用Checkbox处理多对多关系中的编辑操作,通过Category和Product模型实现,并展示了具体的Rails代码实现。
这次是讲多对多情况下的编辑,我们使用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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值