这次是讲多对多情况下的编辑,我们使用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。