0

我目前有以下控制器方法:

def update_all

    params[:users].each do |product, user|
       @product = Product.find(product)
       @product.update_attribute(:user_id, user)
    end
    redirect_to :back, :flash => { :notice => "Updated users" }
  end

这可以按预期工作,但是问题是参数是通过具有默认值的 select_tag 传递的-因此,如果仅更改了一个 select 标记并提交了表单,则所有其他记录都将更新为默认值价值。如何检查属性是否已从其先前的值更改,并且仅当它已更改以更新它?

4

1 回答 1

2

您可以检查脏属性和存在

params[:users].each do |product, user_id|
  @product = Product.find(product)

  if user_id != '--' && user_id != @product.user_id
    @product.update_attribute :user_id, user
  end

  # or
  # if user_id != '--'
  #   @product.user_id = user_id
  #   @product.save if @product.user_id_changed?
  # end
end

或在您的选择标签中设置默认值(来自通过 select_tag 发送额外的参数值

<%= collection_select :user, :id, User.all, :id, :name, { selected: product.user_id }, { name: "users[#{product.id}]" } %>

所以你不必担心默认值。

于 2013-02-11T02:44:42.717 回答