2016-12-11 8 views
0

CanCanCanを使用して、名前空間でモデルレスのコントローラの権限を確認して確認する正しい方法は何ですか?CanCanCanを使用して、名前空間、モデルレスコントローラを認証する方法は?

ずっとグーグルやWikiを読んだ後、私は現在、これは正しくコントローラを許可されていない

#controllers/namespaces/unattacheds_controller.rb 
def Namespaces::UnattachedsController 
    authorize_resource class: false 
    def create 
    # does some stuff 
    end 
end 

#models/ability.rb 
def admin 
    can [:create], :namespaces_unattacheds 
end 

#view/ 
<%= if can? :create, :namespaces_unattacheds %> 
# show a create form to authorized users 
<% end %> 

を持っています。管理者は条件付き作成フォームを見ることができますが、作成アクションに投稿する権限はありません。

post :create, valid_params 
Failure/Error: { it { expect(flash).to have_content "Successfully created" } 
expected to find text "Successfully created" 
got: "You are not authorized to access this page." 

1つの例では、名前空間コントローラ用に別のAbilityクラスを作成することをお勧めします。 https://github.com/CanCanCommunity/cancancan/wiki/Admin-Namespace

これを実現する簡単な方法はありますか?このアプリは多くの名前空間付きコントローラを使用しているため、それぞれのクラスに能力クラスを作成する必要はありません。

Abilityクラスの名前空間コントローラを参照する正しい構文はありますか?

can [:create], Namespaces::Unattacheds 
can [:create], :namespaces_unattacheds 
can [:create], namespaces/unattacheds 
???? 
+0

'名前空間:: UnattachedsController'は、私が思うに、このクラスではなく、デフです。 –

答えて

0

あなたのコントローラが行う必要がないことを意味Namespaces::Unattachedsモデル、上のアクセス権を設定しているように聞こえる:

authorize_resource class: false 

お使いのコントローラがモデルを持っています。 ApplicationControllerからも継承されているのでしょうか? (これは行うには論理的なものになるでしょう。)

、ここで説明したように、only/except句を使用して、特定のコントローラのメソッドへの影響を回避しようとしている場合: https://github.com/CanCanCommunity/cancancan/wiki/Authorizing-controller-actions#choosing-actions

私は名前空間の深さを考えていません。あなたのモデルとコントローラの間で一致する場合は問題です。あなただけのability.rbload_and_authorize_resource、適切なフォームを必要とする:

can [:create], Namespaces::Unattacheds 
+0

ありがとうございます。同じモデル(ユーザー)を参照するコントローラがいくつかあります。しかし、各コントローラには異なる権限が関連付けられています。私は能力をユーザーのために定義することはできないと思います。コントローラのパーミッションを定義する方法が必要です –

+0

すべてのコントローラの 'can'ステートメントは、同じAbilityクラスにある必要があります。現在のコントローラーに関係なく、モデルに基づいて使用可能な操作の完全なセットを記述する必要があります。これは、 'can:create、SomeClass if admin? 'のような文が必要なことを意味します。それをコントローラ中心のものと考えることは、CanCanのアンチパターンです。 –

+0

CanCanを使用すると、管理者だけがユーザーを承認/拒否する(更新アクション)ことができますが、CRUDコントローラ形式から逸脱することなく、ユーザーが独自の属性を更新する方法は? –

関連する問題