原创作者: hideto
阅读:2471次
评论:0条
更新时间:2011-05-26
这次是讲多对多情况下的编辑,我们使用Checkbox来完成该工作:
上面Category和Product是多对多的关系,下面我们来写Product编辑页面:
可以看到,我们用check_box_tag来编辑Product的categories
而category_ids属性是Product的has_and_belongs_to_many自动生成的
下面再看ProductsController的update方法代码:
留意一下,update方法需要先使用params[:product][:category_ids] ||= []来将category_ids清空
不然当我们取消所有的category Checkbox时,后台sql不会传递空的category_ids数组,而是不传递category_ids参数
这样会导致取消不了category Checkbox。
class Category < ActiveRecord::Base has_and_belongs_to_many :products end class Product < ActiveRecord::Base has_and_belongs_to_many :categories end
上面Category和Product是多对多的关系,下面我们来写Product编辑页面:
<%= 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>
可以看到,我们用check_box_tag来编辑Product的categories
而category_ids属性是Product的has_and_belongs_to_many自动生成的
下面再看ProductsController的update方法代码:
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
留意一下,update方法需要先使用params[:product][:category_ids] ||= []来将category_ids清空
不然当我们取消所有的category Checkbox时,后台sql不会传递空的category_ids数组,而是不传递category_ids参数
这样会导致取消不了category Checkbox。
评论 共 0 条 请登录后发表评论