1. ホーム
  2. ruby-on-rails

[解決済み] Rails 4で、以前のバージョンのRailsでattr_accessibleを使用していた状況に遭遇した場合、Forbidden Attributes Errorが発生する。

2022-02-16 09:16:20

質問

最近Rails 4にアップグレードしたところ、以下のようなコードを使用して属性を更新してもうまくいかず、次のようなメッセージが表示されます。 ActiveModel::ForbiddenAttributes というエラーが発生します。

@user.update_attributes(params[:user], :as => :admin)

ここで、Userはモデル内で以下のattr_accessibleの行を持っています。

attr_accessible :role_ids, :as =>admin
# or any attribute other than :role_ids contained within :user

Rails 4で同じ作業を行うにはどうすればよいでしょうか。

どのように解決するのですか?

Rails 4では strong_parameters gem がデフォルトで組み込まれています。

を呼び出す必要はありません。 :as => :admin も必要ありません。 attr_accessible :user_attribute, :as => admin をモデルで使用することができます。 その理由は、railsアプリはデフォルトでモデルのすべての属性に「セキュリティ」を持つようになったからです。 そのため permit にアクセスし、変更したい属性を指定します。

ここで必要なのは permit の間に update_attributes :

@user.update_attributes(params[:user], permit[:user_attribute])

とか、もっと正確に言うと

@user.update_attributes(params[:user].permit(:role_ids))

しかし、この一行で、どのユーザーでも permit テッドロールを使用します。 以下のような別のフィルターを通して、管理者やその他の希望するロールによるこのアクションへのアクセスのみを許可することを忘れないようにしなければなりません。

authorize! :update, @user, :message => 'Not authorized as an administrator.'

. .これは、認証と認可にDeviseとCanCanを使用している場合に有効です。