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

所以問題依然存在,集合不呈現。我覺得可能我應該繞過類定義。 –