2012-10-06 10 views
17

禁断の属性をトリガします。私はカンカンの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がトリガするのか分かりません。私はそれが私が見落とした単純なものだと確信しています。他の誰かがこの問題に遭遇し、それに対する解決策を見つけましたか?

答えて

19

私はbefore_filterでそれを事前にロードしない場合はカンカンが要求されたリソースのために、独自のgetterメソッドを使用しますので、これはあると信じています。ですから、コントローラにこれを追加することができ、それが動作するはずです:(。そして、編集/更新アクションのために同じことを行う)

class UsersController < ApplicationController 
    before_filter :new_user, :only => [:new, :create] 

    load_and_authorize_resource 

    def new_user 
    @user = User.new(safe_params) 
    end 
end 

+0

を私は同じ問題を抱えています信じています。あなたのソリューションをさらに明確にしてもよろしいですか? –

+6

それはしばらくしてきましたが、私はそれを撃つでしょう;)あなたは何を問題にしていますか?基本的には、cancanの 'load_and_authorize_resource'を呼び出すと、強力なパラメータgemの操作に先行するコントローラの名前が与えられたとき、最も「論理的な」リソースをロードしようとします。この場合、ユーザを構築しようとします。 '@user = User.new(params [:user])'しかし、strong_parametersはこのようにマスの割り当てを許可しません。 'before_filter'を使用して@userインスタンス変数を設定すると、CanCanは代わりにそのインスタンスを使用します。 'before_filter'がstrong_parametersに準拠していれば、エラーは発生しません。 –

+0

ああ、ありがとう!私はCanCanがどのように "...自分のgetterメソッドを使って..."であるか理解していませんでしたが、それは今、多くの意味があります。再度、感謝します! –

7
before_filter do 
    params[:user] = safe_params 
end 
load_and_authorize_resource 
+1

** before_filter **の前に** load_and_authorize_resource **の主な強調点があります – Ger

関連する問題