我使用枚举字段enum status: [:pending, :done]
获得文章模型。
这是我的能力档案
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 :(得分: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。
这意味着您不能在&#34;能力&#34;上调用特定条件。在传递类时,必须在对象的实例上调用它。
其次,似乎是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 %>