railsって1つのレコードを更新するのには特に困らないんですが、複数レコード更新したい場合に結構困ります。リスト表示してフラグにチェックいれて更新とか、そういうやつです。似たようなことをやっていたところのコードをコピーして作ろうとしたんですが、strong_parametersのところでエラーが発生。うまくいかず、悩んでいたら、ゆうじさんに教えてもらえました。
fields_forで作った要素をstrong_parametersで許可したいんだがなー…。配列じゃなくて…。
— 尾古 豊明(パトラッシュ) (@patorash) 2014, 6月 10
@patorash obj.each { fields_for … } みたいな感じですか?
— ゆうじ@最近カメじゃないです (@yuji_developer) 2014, 6月 10
@patorash ぼくはたしかfields_for('objs[]', index:nil)にして、params.permit(objs: ATTRIBUTES)みたいな感じで解決した気がします。
— ゆうじ@最近カメじゃないです (@yuji_developer) 2014, 6月 10
@patorash fields_for('objs[]', obj, index:nil)だった。
— ゆうじ@最近カメじゃないです (@yuji_developer) 2014, 6月 10
なるほど。おそらくこれだっ!と思い、やってみたところ、うまくいったぽいので、メモで残しておきます。
View
ビュー側では、form_tag内でfields_forを使って複数のモデルのデータ用フォームを作るのですが、第一引数にhoges[]を渡すことで、複数のデータ用にしておきます。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | - model_class = Hoge = form_tag update_enable_list_hoges_path, method: :put do table thead tr th = model_class.human_attribute_name( :id ) th = model_class.human_attribute_name( :name ) th 有効フラグ tbody - @hoges . each do |hoge| = fields_for( 'hoges[]' , hoge, index: nil ) do |fh| tr td = hoge.id td = hoge.name td = fh.check_box :enable = fh.hidden_field :id .form-actions = submit_tag '更新' |
Controller
コントローラー側では、fields_forの第一引数で定義したhoges[]に対応するようにstrong_parametersを定義します。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | class HogesController < ApplicationController # 省略 private def hoge_params # 通常のcreate, updateで呼ばれるほう end def hoges_params params.require( :hoges ).map do |param| ActionController::Parameters. new (param.to_hash).permit( :id , :enable ) end end end |
これで、複数レコード用のフォームに対応することができました。
ゆうじさん、ありがとう!!