I may be wrong, but I think that enum
only creates instance
methods:.
@article = Article.find params[:id]
@article.done?
I was wrong http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html...
将提供基于枚举字段允许值的范围
以及。以上面的例子:
Conversation.active
Conversation.archived
--
如果不起作用我会删除它;我会根据条件散列 https://github.com/CanCanCommunity/cancancan/wiki/defining-abilities#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
状况:
重要提示:如果存在条件块或散列,则在检查类时将忽略它们,并将返回 true。
这意味着您不能在传递类时调用“能力”的特定条件,必须在对象的实例上调用它。
其次,看来CanCanCan 评估时遇到一些问题enum values https://github.com/CanCanCommunity/cancancan/issues/102,这使得以下代码成为必要:
#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?
method:
#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 %>