3

我得到模型与枚举字段enum status: [:pending, :done]如何在枚举字段中使用CanCanCan?

这里是我的能力文件

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.member? 
     can :read, Article.done 
    end 
    end 
end 

鉴于我试图渲染Article.done集合成员,但没有任何事情渲染。

<% if can? :read, Article.done %> 
    <%= render partial: 'article', collection: Article.done, as: :article %> 
<% end %> 

因此,我有一个问题:是否有任何可能的方式来处理CanCanCan中的枚举?

+0

从我的经验,'enum'不创建任何'类方法'(你在这里使用) –

+0

@RichPeck至少在Rails 4中它实际上是 –

+0

对不起,我错了 –

回答

3

我可能是错的,但我认为enum只创建instance方法:。基于枚举字段的允许值

@article = Article.find params[:id] 
@article.done? 

I was wrong ......

作用域将提供 为好。与上面的例子:

Conversation.active 
Conversation.archived 

-

,我会删除此,如果它不能正常工作;我会评估对hash of conditions,而不是类本身:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.member? 
     can :read, Article, status: Article.statuses[:done] 
    end 
    end 
end 

更新

考虑几个重要的事情。

首先,使用时hash条件:

重要:如果存在一个块或条件散列一类检查时,他们会被忽略,并且将返回true。

这意味着你不能在传递一个类时调用“能力”的特定条件,它必须在一个对象的实例上调用。

其次,它似乎CanCanCan has some issues evaluating enum values,这使得需要下面的代码:

#app/models/ability.rb 
class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    if user.member? 
     can :read, Article do |article| 
     article.done? 
     end 
    end 
    end 
end 

然后,您需要将article实例传递给can?方法:

#app/views/articles/index.html.erb 
<table> 
    <%= render @articles %> 
</table> 

#app/views/articles/_article.html.erb 
<% if can? :read, article %> 
    <tr> 
     <td>Title:</td> 
     <td><%= article.title %></td> 
     <td><%= article.status %></td> 
    </tr> 
<% end %> 
+0

不幸的是它没有解决,但我感谢你的帮助。 –

+1

有没有反馈意见?发生了什么?你得到了什么答复?你不能轻易放弃 –

+0

所以问题依然存在,集合不呈现。我觉得可能我应该绕过类定义。 –