Rails update_attribute

时间:2013-02-11 02:21:57

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

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

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

这可以正常工作,但问题是params是通过select_tag传递的,select_tag有一个默认值 - 所以如果只更改了一个select标签并提交了表单,那么所有其他记录都将被更新到默认值。如何检查属性是否已从之前的值更改,并且只有在更改为更新后才会更改?

1 个答案:

答案 0 :(得分: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标签中设置默认值(来自Sending extra param value via select_tag

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

所以你不必担心默认值。