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[]を渡すことで、複数のデータ用にしておきます。
- 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を定義します。
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
これで、複数レコード用のフォームに対応することができました。
ゆうじさん、ありがとう!!