1

report我想通过 CanCan 根据角色限制对模型的访问。具体来说,我希望: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 回答