最近の 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 行では、すべてのユーザーがpermit
ted ロールを変更できるようになります。次の例のような別のフィルターを使用して、管理者または他の必要なロールのみがこのアクションにアクセスできるようにする必要があります。
authorize! :update, @user, :message => 'Not authorized as an administrator.'
. . . 認証と承認に Devise と CanCan を使用している場合は機能します。