原创作者: hideto   阅读:2453次   评论:0条   更新时间:2011-05-26    
这次是讲多对多情况下的编辑,我们使用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 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics