Rails 4 で禁止属性エラーが発生するのは、以前のバージョンの Rails で attr_accessible が使用されていた状況に遭遇した場合です。質問する

Rails 4 で禁止属性エラーが発生するのは、以前のバージョンの Rails で attr_accessible が使用されていた状況に遭遇した場合です。質問する

最近の 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 で実現するにはどうすればよいでしょうか?

ベストアンサー1

Rails 4には、強力なパラメータデフォルトで組み込まれている gem。

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

今必要なのは、permit次の期間に電話することだけですupdate_attributes:

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

あるいは、より正確に言うと:

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

ただし、この 1 行では、すべてのユーザーがpermitted ロールを変更できるようになります。次の例のような別のフィルターを使用して、管理者または他の必要なロールのみがこのアクションにアクセスできるようにする必要があります。

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

. . . 認証と承認に Devise と CanCan を使用している場合は機能します。

おすすめ記事