使用CanCan限制查询结果

时间:2013-06-25 18:59:06

标签: ruby ruby-on-rails-3 activerecord authorization cancan

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

1 个答案:

答案 0 :(得分:0)

您提供的查询中没有CanCan方法,因此它不了解您的限制。

尝试使用accessible_by来确定关系的范围:

Report.accessible_by(Ability.new(current_user)).pending_approval # ... etc