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 

Update

Несколько важных вещей, чтобы рассмотреть.

Во-первых, при использовании hash условий:

Важно: Если блок или хэш условий существуют, они будут игнорироваться при проверке на классе, и он возвращает истину.

Это означает, что вы не можете называть определенные условия «способностью» при передаче класса, его нужно вызывать на экземпляр объекта.

Во-вторых, это кажется 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

Так что проблема все еще существует, коллекция не отображает. Мне кажется, что я как-то должен обойти использование определений классов. –

Смежные вопросы