1

reportCanCan経由でロールごとにモデルへのアクセスを制限したい。具体的には、:adminすべてを管理する:expert役割、チームに属するすべてのレポートを作成、読み取り、編集し、自分のレポートのみを削除するuser役割、および自分のレポートを作成、読み取り、編集、および削除する役割が必要です。

@reports = report.pending_approval.by_team(current_user.team_id)

次の機能と、関連するすべてのコントローラーのauthorize_resourceに基づいて、上記のクエリはユーザーが作成したレポートのみを返すと予想していましたが、特定のチームのすべてのレポートを返します。問題のチームに割り当てられている場合、特定のチームに属するすべての「保留中」のレポートをクエリで返すようにしcurrent_userます。:expert

current_user が専門家であるかどうかに関係なく、チームに属するすべてのレポートを返す理由を知っている人はいますか? :expert( ) ロールをチェックするようにクエリを変更する必要がありますか? チーム エキスパートのみにアクセスを制限するには、クエリを変更して、クエリまたは CanCan 機能でチーム メンバーシップと役割を確認する必要がありますか?

class Ability                                                                           
  include CanCan::Ability                                                               

  def initialize(user)                                                                  
    user ||= User.new                                                                   

    if user.role? :admin                                                                
      can :manage, :all                                                                 
    elsif user.role? :expert                                                                                      
      can :read, Report, :user_id => user.id, :submitted => false                
      can :create, Report                                                            
      can :update, Report, :user_id => user.id, :submitted => false              
      can :destroy, Report, :user_id => user.id, :submitted => false             
    else                                                                                                                             
      can :read, Report, :user_id => user.id, :submitted => false                
      can :create, Report
      can :update, Report, :user_id => user.id, :submitted => false              
      can :destroy, Report, :user_id => user.id, :submitted => false             
    end                                                                                 
  end                                                                                   
end  
4

1 に答える 1

0

指定したクエリには CanCan メソッドが含まれていないため、制限について認識していません。

accessible_by関係をスコープするために使用してみてください:

Report.accessible_by(Ability.new(current_user)).pending_approval # ... etc
于 2013-06-25T19:28:28.730 に答える