gpt4 book ai didi

ruby - 每个用户一个角色的 cancan - 有什么方法可以在不重复这么多文本的情况下设置能力?

转载 作者:数据小太阳 更新时间:2023-10-29 08:53:34 24 4
gpt4 key购买 nike

我的能力模型看起来像这样:

class Ability
include CanCan::Ability

def initialize(user)
if user.role == "moderator"
can :manage, [Forum, Post]
elsif user.role == "admin"
can :manage, [Enrollment, SiteCare, Forum, Post]
elsif user.role == "superadmin"
can :manage, [Permission, Enrollment, SiteCare, Forum, Post]
end
end
end

实际上,有些角色管理着十几个项目。为了简化事情,我如何构建一些 ruby 来避免我复制这么多文本?也许是这样的结构?

class Ability
include CanCan::Ability

def initialize(user)
a = "Forum, Post"
b = "Enrollment, SiteCare"
c = "Permission"

if user.role == "moderator"
can :manage, [{a}]
elsif user.role == "admin"
can :manage, [{a + b}]
elsif user.role == "superadmin"
can :manage, [{a + b + c}]
end
end
end

谢谢。

附言我知道每个用户方法的多个角色(bitmaskSeparate Role Model)并且不希望设置额外的模型或数据库表。

最佳答案

我自己使用单独的角色模型。按照您的代码模型,我可以想到一种方法。合并字符串,然后为每个对象(用冒号分隔)使用 constantize , 所以你会得到一个常数。

class Ability
include CanCan::Ability

def initialize(user)
a = "Forum,Post"
b = "Enrollment,SiteCare"
c = "Permission"

if user.role == "moderator"
can :manage, permissions(a)
elsif user.role == "admin"
can :manage, permissions(a, b)
elsif user.role == "superadmin"
can :manage, permissions(a, b, c)
end
end

private
# TODO: think of a better function name?
def permissions(*args)
args.join(",").split(",").map(&:constantize)
end
end

连接后的拆分是必要的。您连接所有字符串,然后将每个类(论坛、帖子等)分隔成一个新字符串。完成之后,您对每个字符串调用 constantize,接收一个您可以使用的常量。 “论坛”-> 论坛

我在没有常量化的情况下使用 irb 进行了基本测试,它似乎工作正常。试试吧!

关于ruby - 每个用户一个角色的 cancan - 有什么方法可以在不重复这么多文本的情况下设置能力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7034073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com