0
0

ActiveModel::ForbiddenAttributesErrorの解決法

Posted at

はじめに

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::RegistrationsControllercreateアクションで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と組み合わせて使用する際には、その自動ロード機能が原因でエラーが発生する場合があります。適切なパラメータ許可と明示的な認可チェックを行うことで、この問題を解決できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0