Возможно, я ошибаюсь, , но я думаю, что 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 %>
Из моего опыта, 'enum' не создает каких-либо 'методов класса' (которые вы используете здесь) –
@RichPeck По крайней мере, в Rails 4 это действительно –
Извините, что я ошибся –