Rails4: fields_forとstrong_parametersで複数レコードの更新に対応する方法

railsって1つのレコードを更新するのには特に困らないんですが、複数レコード更新したい場合に結構困ります。リスト表示してフラグにチェックいれて更新とか、そういうやつです。似たようなことをやっていたところのコードをコピーして作ろうとしたんですが、strong_parametersのところでエラーが発生。うまくいかず、悩んでいたら、ゆうじさんに教えてもらえました。

なるほど。おそらくこれだっ!と思い、やってみたところ、うまくいったぽいので、メモで残しておきます。

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

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


カテゴリー Ruby, Ruby on Rails | タグ | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です