Ruby 什么是';右';基于';打开/关闭应用程序功能的数据结构;类型';算什么?
我的应用程序有10项功能可启用/禁用,具体取决于用户拥有的3种“类型”帐户中的哪一种 目前,我有10种方法(每个功能一种),大致如下:Ruby 什么是';右';基于';打开/关闭应用程序功能的数据结构;类型';算什么?,ruby,Ruby,我的应用程序有10项功能可启用/禁用,具体取决于用户拥有的3种“类型”帐户中的哪一种 目前,我有10种方法(每个功能一种),大致如下: def is_FEATURENAME_enabled case currentuser.accounttype when "A", "C" # account types allow to see that feature return true else return false end end 然后,在我可能禁用某个功能的
def is_FEATURENAME_enabled
case currentuser.accounttype
when "A", "C" # account types allow to see that feature
return true
else
return false
end
end
然后,在我可能禁用某个功能的每个地方,我都会这样做
if foo.is_SOMEFEATURE_enable
do stuff to enable that feature
end
它起作用了。这并不难维持。但应该有更好的办法。我认为正确的解决方案是在一个地方定义某种结构(哈希?我不知道),将启用的功能映射到AccountType,然后使用一个方法,我称之为:
if foo.is_feature_enabled(:FEATURENAME)
do stuff to enable feature
end
FeatureA: usertype1
FeatureB: usertype1, usertype3
FeatureC: usertype2
...
其中方法已启用功能
查看currentuser.accountype
并检查映射结构以查看标识的功能是否已启用
我怀疑定义映射的枯燥方法(考虑到我拥有的特性比帐户类型多得多)是列出所有特性一次,然后针对每个特性列出有权访问该特性的帐户类型(而不是相反)。这样,当我添加一个新特征时,我只需要编辑映射中的一条线。比如:
if foo.is_feature_enabled(:FEATURENAME)
do stuff to enable feature
end
FeatureA: usertype1
FeatureB: usertype1, usertype3
FeatureC: usertype2
...
似乎比以下内容更符合逻辑且更易于维护:
usertype1: FeatureA, FeatureB, FeatureD, FeatureG
usertype2: FeatureC, FeatureD
usertype3: FeatureB, FeatureD, FeatureG, FeatureH
如果您有任何建议,我们将不胜感激,并对您学习使用ruby进行操作的正确方法具有指导意义。我认为您已经发现了自己做这件事的最佳方法——您的建议是明智的。只需将功能名称用作哈希的查找键,然后获取结果列表并检查该列表是否包含当前用户的帐户类型 例如:
听起来你好像在找某种类型的工作。我还没有遇到过一个红宝石。但是我肯定我错过了一些,所以我很高兴在评论中被纠正。我想你没有使用RoR?在这种情况下,如果还没有,请看一看。它可以为您提供实现自己的DSL以管理授权的想法。如果您使用的是RoR,那么您可以简单地使用gem。我建议使用基于信任的模型,而不是基于角色的模型,其中每个用户都有一个信任分数。然后,您只需在每个特性上标记其所需的最小信任分数。这与SO处理用户声誉分数的方式相当(SO有10多个可解锁的功能),并且比基于角色的模型更简单、更具可扩展性。@我同意你所说的基于信任的模型——对于许多情况,可能大多数情况,这可能更容易。然而,在一些没有严格“阶梯”的情况下,基于角色的模型是必不可少的(例如,有些事情老师可以做,学生不能做,比如成绩报告,而有些事情学生可以做,老师不能提交报告。或者,警察可以提交逮捕文书,但不能判刑,法官可以判刑,但不能逮捕人。)因此,考虑一下您的特殊需求,如果可以,尝试使用信任模型,但如果不能,就不要这样做。感谢大家的讨论。是的,我正在Heroku上使用rails 3。并设计。然而,cancan超出了我微薄的实现能力……我需要它的一小部分,我认为滚动我自己的将是实现的方式或者现在。谢谢你!非常有帮助。足够多的新手了,事实上我不知道如何做到这一点…所以非常感谢你的榜样!没问题!坚持下去,你会走得更远的!