如何将CanCanCan与enum字段一起使用?

时间:2016-01-23 13:02:32

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 authorization cancancan

我使用枚举字段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中有没有可能使用枚举的方法?

1 个答案:

答案 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 %>