我目前有以下控制器方法:
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}]" } %>
所以您不必担心默认值。