もふもふ技術部

Rails4、fields_forを使って一括更新する処理のベストプラクティスは何だろう


has_manyなassociationしているModelの一括更新する場合は、普通にform_forとfields_forとaccept_nested_attributesを使えばすんなり出来るんだけど、一括更新したいケースって必ずしもassociationしているわけでもなくて、そういう場合どうすればいいかいつも迷うので自分なりのベストプラクティスを見つけとこうと思った。

こんな感じでやってみた

一括更新したいitemsをscaffoldする。

コマンドでitemを登録しておく。

edit,updateアクションで一括更新処理を実装しようと思うのでidは不要だからresourceを使う。resourcesじゃないよ。

routes.rb

viewはこんな感じ。

_form.html.erb

items_controller.rb

画面

スクリーンショット 2015-01-26 23.21.19

ポイント

fields_forの第一引数に[]をつけると、各formのnameにitems[id]という形式で展開される。

_form.html.erb

html

普通にform_forと異なる形式になるのでstrong_parameterの部分を工夫する必要があります。
items_controller.rb

items_paramsを通すと下のようにパラメータを取得できます。id => attributesという形式になるので扱いやすいかな。

おまけ

あれ?ロジックあってるのにちゃんと更新されないなーおかしいなーと思ったら、なんだstrong_parameterの指定漏れかよ…って経験はよくあるかと思います。

よくハマるようだったらapplication.rbかdevelopment.rbあたりにこれを指定しておくと、例外投げてくれるので指定漏れにすぐ気づけると思う。

参考

http://o.inchiki.jp/obbr/181

The following two tabs change content below.
原田 敦

原田 敦

日本CAWのエンジニア。もふもふ部の部長。得意分野はRuby on Railsを使った小規模WEBアプリケーションを高速で開発すること。週末の楽しみは一人お菓子パーティー。三度の飯より小動物をもふもふするのが好きです。
Tagged on: ,