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