禁断の属性をトリガします。私はカンカンのload_and_authorize_resource
にシンプルなコールを追加すると、私のconfig/initializers
でカンカンload_and_authorize_resourceは私が強いパラメータを使用して、標準のRESTfulなコントローラを持って
class UsersController < ApplicationController
respond_to :html, :js
def index
@users = User.all
end
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def edit
@user = User.find(params[:id])
end
def create
@user = User.new(safe_params)
if @user.save
redirect_to @user, notice: t('users.controller.create.success')
else
render :new
end
end
def update
@user = User.find(params[:id])
if @user.update_attributes(safe_params)
redirect_to @user, notice: t('users.controller.update.success')
else
render :edit
end
end
def destroy
@user = User.find(params[:id])
if current_user != @user
@user.destroy
else
flash[:error] = t('users.controller.destroy.prevent_self_destroy')
end
redirect_to users_url
end
private
def safe_params
safe_attributes =
[
:first_name,
:last_name,
:email,
:password,
:password_confirmation,
]
if current_user.is?(:admin)
safe_attributes += [:role_ids]
end
params.require(:user).permit(*safe_attributes)
end
end
私はテストで@attr
が
1) UsersController POST create with invalid params re-renders the 'new' template
Failure/Error: post :create, user: @attr
ActiveModel::ForbiddenAttributes:
ActiveModel::ForbiddenAttributes
# ./spec/controllers/users_controller_spec.rb:128:in `block (4 levels) in <top (required)>'
を取得し、ファイルstrong_parameters.rb
ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
を持っています
before(:each) do
@attr =
{
first_name: "John",
last_name: "Doe",
email: "[email protected]",
password: "foobar",
password_confirmation: "foobar"
}
end
私はそれがすべてのセットアップが正しくユーザーにログインして、それらを管理者であることのために必要な役割を与えなければならないテストで
ので、私はそれがないと知っています。私はなぜこれが原因でForbiddenAttributesがトリガするのか分かりません。私はそれが私が見落とした単純なものだと確信しています。他の誰かがこの問題に遭遇し、それに対する解決策を見つけましたか?
を私は同じ問題を抱えています信じています。あなたのソリューションをさらに明確にしてもよろしいですか? –
それはしばらくしてきましたが、私はそれを撃つでしょう;)あなたは何を問題にしていますか?基本的には、cancanの 'load_and_authorize_resource'を呼び出すと、強力なパラメータgemの操作に先行するコントローラの名前が与えられたとき、最も「論理的な」リソースをロードしようとします。この場合、ユーザを構築しようとします。 '@user = User.new(params [:user])'しかし、strong_parametersはこのようにマスの割り当てを許可しません。 'before_filter'を使用して@userインスタンス変数を設定すると、CanCanは代わりにそのインスタンスを使用します。 'before_filter'がstrong_parametersに準拠していれば、エラーは発生しません。 –
ああ、ありがとう!私はCanCanがどのように "...自分のgetterメソッドを使って..."であるか理解していませんでしたが、それは今、多くの意味があります。再度、感謝します! –