はじめに
Railsアプリケーションにおいて、ActiveModel::ForbiddenAttributesError
が発生するという問題に直面することがあります。これはストロングパラメータが適切に設定されていない場合によく起こります。本記事では、このエラーの解決方法をQ&A方式で紹介します。
Q1: エラーの内容は?
A1: ActiveModel::ForbiddenAttributesError
は、許可されていないパラメータをマスアサインメントしようとした際にRailsが発するエラーです。
Q2: ストロングパラメータは正しく設定されていましたか?
A2: はい、コントローラーではstaff_params
というメソッドを使ってストロングパラメータを設定していました。このメソッド内でrequire(:staff)
とpermit
を用いてパラメータの許可を行っていました。
Q3: パラメータの中身を確認しましたか?
A3: はい、binding.pry
を用いてパラメータが正しく渡されていることを確認しました。
Q4: load_and_authorize_resource
を削除すると登録できるようになりましたか?
A4: はい、load_and_authorize_resource :class => 'Staff'
を削除するとエラーが解消され、正常に登録できるようになりました。しかし、これではCanCanCanによる権限制御ができません。
Q5: load_and_authorize_resource
の書き換えは?
A5: load_and_authorize_resource :class => 'Staff', except: [:create]
に書き換えました。また、create
アクション内で@staff = Staff.new(staff_params)
としてパラメータを持たせました。
Q6: 最終的な解決策は?
A6: Staffs::RegistrationsController
のcreate
アクションでload_and_authorize_resource
を使わず、Staff
インスタンスを明示的に新しいストロングパラメータと共に作成し、authorize!
メソッドを使用して手動で認可チェックを行いました。
解決までのステップバイステップ
ステップ1: ストロングパラメータの確認
最初に、ストロングパラメータが正しく設定されているかをstaff_params
メソッドを確認します。
private
def staff_params
params.require(:staff).permit(:company_id, :name, :email, ...)
end
ステップ2: パラメータの存在を確認
binding.pry
を挿入し、パラメータが正しく渡されていることをコンソール上で確認します。
ステップ3: CanCanCanの挙動を確認
load_and_authorize_resource
の記述を一時的にコメントアウトして、エラーが解消されるかテストします。
ステップ4: CanCanCanの設定を変更
create
アクションの自動ロードをスキップするために、load_and_authorize_resource
のオプションを調整します。
load_and_authorize_resource :class => 'Staff', except: [:create]
ステップ5: 認可チェックの実装
create
アクション内で手動で認可チェックを行います。
def create
@staff = Staff.new(staff
_params)
authorize! :create, @staff
...
end
まとめ
RailsにおけるActiveModel::ForbiddenAttributesError
は、ストロングパラメータの不適切な設定によって引き起こされることが多いですが、CanCanCanと組み合わせて使用する際には、その自動ロード機能が原因でエラーが発生する場合があります。適切なパラメータ許可と明示的な認可チェックを行うことで、この問題を解決できます。