首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CanCan中正确定义能力

在CanCan中正确定义能力
EN

Stack Overflow用户
提问于 2013-04-26 11:12:57
回答 2查看 71关注 0票数 0

我正在使用CanCan进行授权。下面的代码以我想要的方式为用户工作,即它允许非管理员用户查看自己的页面,但不允许其他用户的页面。然而,定义成绩册功能的那行既允许访问用户的成绩册(它与属于用户的成绩册是一对一的关系),也允许查看其他用户的成绩册。

代码语言:javascript
复制
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.has_role? :admin
      can :manage, :all
    else
      can :read, User, :id => user.id
      can :read, Gradebook, :user_id => user.id
    end
  end
end

CanCan文档包括以下示例:

代码语言:javascript
复制
can :read, Project, :active => true, :user_id => user.id

这似乎为我正在尝试做的事情提供了一个模型,但我不能让CanCan在允许访问用户自己的成绩册的同时阻止访问其他用户的成绩册。我也尝试过以下几种方法:

代码语言:javascript
复制
cannot :read, Gradebook do |book|
  book.user_id != user.id
end

但这阻止了对任何成绩册的访问。我还尝试了无数的其他排列,但都无济于事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-30 02:19:29

我想通了。这与Gradebook是一个嵌套资源的事实有关。在成绩册控制器中,我最初只是放置了load_and_authorize_resource调用,但我将其更改为:

代码语言:javascript
复制
load_and_authorize_resource :user
load_and_authorize_resource :gradebook, :through => :user, :singleton => true

然后在我的能力文件中,我使用了以下内容:

代码语言:javascript
复制
  can :read, Gradebook, :user => { :id => user.id }

现在,它的行为符合预期。

票数 0
EN

Stack Overflow用户

发布于 2013-04-26 11:29:36

我的应用程序中有这样的代码,它工作得很好。你可以试一下:

代码语言:javascript
复制
def initialize(user)
  user ||= User.new
  if user.has_role? :admin
    can :manage, :all
  else
    can :read, user
    can :read, Gradebook, user: user
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16228144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档