Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 什么是';右';基于';打开/关闭应用程序功能的数据结构;类型';算什么?_Ruby - Fatal编程技术网

Ruby 什么是';右';基于';打开/关闭应用程序功能的数据结构;类型';算什么?

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 然后,在我可能禁用某个功能的

我的应用程序有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
然后,在我可能禁用某个功能的每个地方,我都会这样做

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超出了我微薄的实现能力……我需要它的一小部分,我认为滚动我自己的将是实现的方式或者现在。谢谢你!非常有帮助。足够多的新手了,事实上我不知道如何做到这一点…所以非常感谢你的榜样!没问题!坚持下去,你会走得更远的!