酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Railsのフォームで複数レコードを一括更新

今回は自分用のメモです。Railsのフォームで複数レコードを一括で更新させる方法です。といっても適切な答えをうまく見つけ出せず、力技で逃げただけのコードです。もし、うまく書ける方法かより適切な手順をご存知の方がいらっしゃればぜひ、コメント下さい!


やりたいこと

(1) あるView上でフォームを作る
(2) フォームでは、あるモデルの複数レコードを編集できるようにする
(3) 編集が完了したら、View上の1つのボタンでフォームをsubmitする
(4) フォームのsubmitを受けて、複数レコードを更新する

View側のコード

View側のフォームはHAMLでは次の通り。

1
2
3
4
5
6
7
8
= form_tag products_update_path do
  %table
    - products.each do |product|
      %tr
        = hidden_field_tag nil, product.id, name: "products[][id]"
        %td= text_field_tag nil, product.name, name: "products[][name]"
        %td= text_field_tag nil, product.price, name: "products[][price]"
  = submit_tag "更新", class: "btn"

Controller側のコード

Controller側のコードは次の通り。

1
2
3
4
5
6
def update
  params[:products].each do |params_product|
    model_product = self.where(id: params_product[:id]).first_or_initialize
    model_product.update_attributes!(params_product)
  end
end

う〜〜ん、何回見ても違和感がある。もしスマートな方法をご存知の方がいれば、コメント下さい!

おすすめの書籍