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を介して渡されることです。したがって、1つの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タグにデフォルト値を設定します(select_tagを介した追加のパラメータ値の送信から)

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

したがって、デフォルト値について心配する必要はありません。

于 2013-02-11T02:44:42.717 に答える