4

Rails 3.2.6アプリケーションにDeviseとCancanを利用しています。アプリケーションでは、ユーザーがフォームに集められた情報を含むドキュメントを作成できるようにします。次に、ユーザーが localhost:3000/users/1/documents のドキュメント インデックス ページに自分のドキュメントのみを一覧表示できるようにします。これは機能しています。うまくいかないのは、/users/:id/documents を別の番号に置き換えることで、ユーザーが他のユーザーのドキュメントを表示できないように制限しようとしていることです。

私はcancanを使用しており、両方を試しました

can :index, Document, :user_id => user.id can :read, Document, :user_id => user.id

次に、ドキュメント コントローラーのインデックス メソッドで

if can? :read, Document
 @documents = @user.documents
else
 redirect_to root_path
end

も試してみ:indexました...しかし、これは機能しません。私も使用してload_and_authorize_resourceいます..

私が欠けているものについて何か考えはありますか?

cancan は、管理者がユーザーを作成、一覧表示、編集するためのユーザー管理とユーザー コントローラーのために機能しているため、cancan が一般的に機能していることはわかっています。また、ユーザー ドキュメントの更新と削除にも取り組んでいます。インデックス機能が機能していないだけです。

class Ability 

include CanCan::Ability 

  def initialize(user) 

    user ||= User.new # guest user (not logged in) 
    if user.id 
      if user.has_role? :user 
        can :create, Document 
        can :read, Document, :user_id => user.id 
        can :update, Document, :user_id => user.id 
      end 
    end 
  end 
end
4

2 に答える 2

2

ログインしていないユーザー、およびuser.idドキュメントuser_id(ドキュメントの所有者) とは異なるユーザーがすべてのドキュメントを読み取る権限を持っていないことを確認する必要があります。

class Ability
  include CanCan::Ability

  def initialize(account)

    user ||= User.new  #non-logged-in user

    # logged in users
    if user.id and user.has_role?(:user)

      #content owners
      can :manage, Document, :user_id => user.id

      #other logged-in users
      can [:show, :create], Document

    end

  end
end

cancan が既に動作していると言った場合、どこかに許可を与えているcan :read, :allような行がないことに注意してください。can :read, Document

于 2012-09-17T17:55:34.897 に答える
0

あなたの場合、あなたの能力クラスに書くべきです

def initialize(user)
  can :manage, Document do |document|
    document.user == user
  end  
end

これにより、ドキュメントがログインしているユーザーのものかどうかがチェックされます。はいの場合は true を返し、それ以外の場合は false を返します。

ブロックで複雑な承認を処理する方法の詳細については、

https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks

于 2012-09-17T18:09:46.343 に答える