Rails update_attribute



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

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_ttag有一个默认值——因此,如果只更改了一个select标记并提交了表单,那么所有其他记录都将更新为默认值。如何检查属性是否与以前的值发生了更改,并且仅在更改后才能更新?

您可以检查脏属性和是否存在

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}]" } %>

所以您不必担心默认值。

相关内容

  • 没有找到相关文章

最新更新