如何一次检查多个cancan属性。缺少Rails语法知识

时间:2013-02-01 13:30:10

标签: ruby-on-rails ruby cancan

我收到了像这样的if语句

if can?(:read, Category) || can?(:read, Category2)

如果用户可以阅读类别或类别2,则会显示链接。

但如果我喜欢10个分类怎么办?必须有一个较短的方式而不是列出它们。我需要一些帮助。

3 个答案:

答案 0 :(得分:2)

我认为更快的方法(如果你已经有类别列表)是使用detect,因为它是一个OR并且只需要其中一个条件为真

categories.detect { |cat| can? :read, cat }

答案 1 :(得分:1)

假设您有一些对象列表:

categories = [Category1, Category2, Category3]

您可以使用inject获取结果,如下所示:

categories.inject(false) { |p, cat| p || can?(:read, cat) }

字面意思评估的是:

(((false || can(:read, Category1)) || can(:read, Category2)) || can(:read, Category3))

当然等同于:

can?(:read, Category1) || can?(:read, Category2) || can?(:read, Category3)

答案 2 :(得分:1)

jvnill的方式还可以,但我认为这应该更快更清晰,因为它只返回一个布尔值:

[Category, Category2, ...].any?{|cat| can?(:read, cat)}