我目前有以下控制器方法:
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标签并提交了表单,那么所有其他记录都将被更新到默认值。如何检查属性是否已从之前的值更改,并且只有在更改为更新后才会更改?
答案 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}]" } %>
所以你不必担心默认值。