我可以在OR条件中放置多个值吗?

时间:2018-04-23 13:01:57

标签: ruby-on-rails ruby

我的应用中有三个角色: root-user> kubectl get services --all-namespaces -o wide NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR default kubernetes ClusterIP 100.24.1.0 <none> 443/TCP 26d <none> default registration-service ClusterIP None <none> 8080/TCP 18d app=registration-service default app-framework ClusterIP None <none> 24366/TCP 25d app=app-framework default stt LoadBalancer 100.56.9.26 a548cdb75447611e897960efe53682ba-1445165219.us-east-2.elb.amazonaws.com 8443:31327/TCP 3d app=stt kube-system kube-dns ClusterIP 100.46.0.10 <none> 53/UDP,53/TCP 26d k8s-app=kube-dns kube-system kubernetes-dashboard ClusterIP 100.96.205.42 <none> 443/TCP 26d k8s-app=kubernetes-dashboard admindev。在我的标题中,client可以访问与dev相同的标签。

我试过了:

admin

适用于li = link_to 'Mon compte', client_edit_infos_path unless current_client.role == 'admin' || 'dev' admin个角色,但不适用于dev角色。

有人可以告诉我另一种方法来授权两个角色并限制一个吗?

4 个答案:

答案 0 :(得分:1)

%w(admin dev).include?(current_client.role)

答案 1 :(得分:1)

请使用授权gem,例如:https://github.com/CanCanCommunity/cancancan

手动操作非常容易出错并且不易维护。

您只需要定义自己的能力:

然后在你的代码中:

<% if can? :update, @client_info %>
  <%= link_to "Mon compte", client_edit_infos_path %>
<% end %>

另外,不要忘记在控制器操作中设置相同的限制!否则,用户可以绕过您的视图并手动触发您的操作,并可以访问他们不应该访问的内容。

答案 2 :(得分:0)

是的,您可以向||添加尽可能多的参数运营商.. 结果如果任何条件变为真,它将返回true 请参阅此http://www.dummies.com/programming/c/how-to-create-multiple-comparisons-with-logic-in-c-programming/ 希望这会帮助你

答案 3 :(得分:0)

对于一个实际的解决方案,我建议其他一个答案,但这里的方法是如何按照你原来的意图(也就是说出错了)。

问题在于行尾的条件:unless current_client.role == 'admin' || 'dev'

红宝石在这里做的不是你的想法; 'admin' || 'dev'评估为'admin',因此整个条件相当于unless current_client.role == 'admin'

||运算符的工作方式是:

  • 如果第一个操作数是真实的,则是操作的结果。
  • 如果第一个操作数为falsey,则第二个操作数是操作的结果。

例如,true || false评估为true,'hello' || 'world''hello'nil || 'world'评估为&#39; world&#39;。

正确的条件是unless current_client.role == 'admin' or current_client.role == 'dev'

or||的效果相同,但与higher precedence相同。