最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです!
#なぜエラーが発生したか?
このエラーが起きた状況は、Active Adminで作成したユーザー管理画面において編集機能を追加するために
actionsに:editを追加した所、Routing Error No route matches [PATCH] "/admin/users/1"が発生
して、それを解決した後、編集したデータを更新した際に発生いたしました。
ActiveModel::ForbiddenAttributesError in Admin::UsersController#update
ActiveModel::ForbiddenAttributesError
##なんのエラーか?
A(アンサー):Strong Parameters(ストロングパラメータ)関連のエラー
Rails 4 では attr_accessible の代わりに Strong Parameters が導入されました。これはホワイトリスト化されたアトリビュートをモデルからコントローラへ渡します。
どのパラメータが変化するかを定義する permit_params メソッドを用います。
Action Controller の概要 - Railsガイド
例えば、ブログを投稿するフォームを考えると公開日時や更新日時をユーザからのリクエストに基づいて設定できるというよりは、サーバ側でのレコード作成・更新の時間を記録するという場合が考えられます。
この例のようにクライアント側にどういったパラメータでのモデルの作成・更新を許可するか?というのを設定するのがストロングパラメータです。このストロングパラメータを介さずにモデルを作成・更新を行おうとすると冒頭で説明したActiveModel::ForbiddenAttributesErrorが発生します。
今回の場合、ユーザー情報の値を編集し、新しい値を更新しようとした場合どのパラメータの更新を許可するかを設定していないことが原因でした。
#解決方法
####参考記事
・Strong Parameters について調べてみた(ActiveAdminの対応も含む)
ActiveAdmin Controllerの場合
冒頭にactive_admin:installで自動生成されたadmin_user.rbの controller do ブロックの中を書き換えます。
僕の場合は、admin/user.rbだったので
ActiveAdmin.register User do
…省略
controller do
def permitted_params
{user: params.require(:user).permit(:email, :password, :password_confirmation)}
end
end
…省略
end
また、こちらの方法でもできました!
ActiveAdmin.register User do
…省略
permit_params :email, :password, :password_confirmation
こんな感じに自分の環境用に変更が必要な値を設置したら無事解決いたしました。
##参考にした記事
・【Rails】パラメータからcreateするときにはまったところメモ
・I got ActiveModel::ForbiddenAttributesError, can't fix it. Please help.
・リクエストパラメータの検証を行うStrongParameter(ストロングパラメータ)
・ネストするStrong Parametersの書きかた
・how to permit an array with strong parameters