2

CanCanが能力とどのように連携するかをよりよく理解できるように、フィードバックを取得したい4つのシナリオがあります。

1-モデルをCanCanに渡すために許容できる反復からのオブジェクトを使用しています。うまくいくようです。これは、渡されたオブジェクトから非常に特定の能力を定義するようです。

 @users.each do |user|
    link_to user.name, user_path(user) if can? :edit, user

2-@userは、コントローラーで設定される変数ではありません。load_and_authorize_resourceが@userインスタンスを作成するため、これは#1と同じだと思います。

 @users.each do |user|
    link_to user.name, user_path(user) if can? :edit, @user

ただし、現在のモデルに関連せず、コントローラーで意図的に設定されていないビューにインスタンス変数が存在する場合はどうでしょうか。たとえば、@ accountインスタンスがshowアクションで設定されていない場合の、showuserページ内の次のようになります。CanCanは、@ accountが何であるかさえ知らないはずなのに、どのように使用できますか?

  link_to "view user account", account_path(1) if can? :read, @account

3-モデルを使用して能力を定義するのはどうですか?これは非常に幅広い「ユーザーを編集できる」機能だと思います...いつこれを使用しますか?

 @users.each do |user|
    link_to user.name, user_path(user) if can? :edit, User

4-関連付けを使用します。ページを壊さない...しかし、それが期待どおりに機能しているかどうかはわかりません。

 @users.each do |user|
    link_to "view user account", account_path(1) if can? :read, user.account
4

1 に答える 1

1

うーん、複数の部分からなる質問です。

ケース #1 と #2

この 2 つはほぼ同じです。違いは、アクションの前に実行されるまたは他のフィルターを使用@userして、コントローラーで変数が事前に設定されていることです。load_and_authorize_call

これは、単一のオブジェクトの権限を確認したい場合に便利です。つまり、ユーザーは自分のレコードしか編集できません。

ケース #2 の終わりの場合:

コントローラーまたはビュー内で変数にアクセスして権限チェックを行う前に、コントローラー内で変数が設定されていることを確認する必要があります。パーミッションチェックとは関係のない他のインスタンスでそれらにアクセスしたい場合と同じです。

ケース #3

主に、ユーザーが特定のクラスのすべてのオブジェクトを編集できる場合に使用されます。

これは、ユーザーが特定のクラスのすべてのオブジェクトを編集できるようにする場合に便利です。つまり、管理者はすべてのユーザーの詳細を編集できます。

ケース#4

関連付けを使用すると、would を使用する場合と同様に、そのレコードを取得して CanCan に渡しif can? :read, userます。ケース#1と実際には違いはありません。

于 2012-10-18T01:10:10.723 に答える