首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails可以为多个设计模型提供能力类

Rails可以为多个设计模型提供能力类
EN

Stack Overflow用户
提问于 2011-10-26 02:21:16
回答 1查看 3.8K关注 0票数 10

我想知道如何定义一个能力类并根据登录用户的不同为该能力类提供服务。

我正在使用Active Admin,可以和设计,我已经成功地创建了一个用户和AdminUser模型。

我的ability.rb里有这个

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

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

    if (user)
      can :manage, Item
    end
  end
end

现在,我已经使用这个wiki条目来确定我们确实可以定义一个自定义能力文件,并使用它来代替ability.rb:

https://github.com/ryanb/cancan/wiki/changing-defaults

但是我想要做的是,如果“非管理用户”被登录,则可以使用ability.rb,如果用户管理被登录,则可以使用自定义能力。

侧问题:这样做可以使我不需要一个自定义的ability.rb文件,并且可以在一个ability.rb文件中设置权限吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-27 12:29:00

我从来没有真正使用过ActiveAdmin,所以我不完全确定我是否遗漏了什么,但是这个框架似乎并不依赖于CanCan。这就是为什么我假设您定义了一个current_ability方法,就像在wiki中解释的那样,并且它是用Ability.new(current_user)实例化的。

如果是这样,并且您的current_user可以是UserAdminUser,那么在Ability类中检查它就没有问题:

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

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

    if user.kind_of? AdminUser
      can :manage, Item
    elsif user.kind_of? User
      can :read, Item
    end
  end
end

您可以简单地查看用户的类型并相应地更改规则。您也可以使用is_a?而不是kind_of?来进行更严格的检查,但是它可能不是必需的,如果以后决定进行继承,可能会导致问题。

检查的另一种方法是在两个模型中定义一个admin?方法。这可能是一种更好的方法,因为显式类型检查在ruby中并不是很流行--它常常限制您的选择。看起来可能是这样的:

代码语言:javascript
运行
复制
class User < ActiveRecord::Base
  def admin?
    false
  end
end

class AdminUser < ActiveRecord::Base
  def admin?
    true
  end
end

class Ability
  include CanCan::Ability

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

    if user.admin?
      can :manage, Item
    else
      can :read, Item
    end
  end
end
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7898082

复制
相关文章

相似问题

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