8

我已经用 Devise 和 CanCan 启动了一个 Rails 应用程序。我有与文章有一对多关系的用户。我是 CanCan 的新手,这就是我打算做的事情:

行政

  • 可以对文章执行任何操作

登录用户

  • 可以阅读和创建文章
  • 可以编辑和销毁自己的文章

访客用户

  • 可以看文章

但我无法理解 CanCan 的语法。我知道它会是这样的。

def initialize(user)
  user ||= User.new
  if user.admin?
    can :manage, Article
  else
    can :read, Article
  end
end

但这仅适用于管理员和来宾用户,我不确定如何区分来宾用户和登录用户,因为当用户为空时它会创建一个新的用户对象。我已经看到代码应该是这样的can [:edit, :destroy], Article, :user_id => user.id,但我不确定这将如何适合初始化方法。

最后一个问题,如果我只can :read, Article在来宾上定义一个,它会阻止其他操作,例如创建和更新,例如将读取操作列入白名单吗?

任何帮助,将不胜感激。非常感谢!

4

2 回答 2

22

这是我所做的:

在能力.rb

def initialize(user)
  if user.nil?
    can :read, Article
  elsif user.admin?
    can :manage, Article
  else
    can [:read, :create], Article
    can [:update, :destroy], Article, :user_id => user.id
  end
end

为了显示链接,我使用了这个:

- if can? :read, Article
  = link_to 'Show', article
- if can? :create, Article
  = link_to 'New Article', new_article_path
- if can? :update, article
  = link_to 'Edit', edit_article_path(article)
- if can? :destroy, article
  = link_to 'Destroy', article, method: :delete, data: { confirm: 'Are you sure?' }

它现在似乎正在工作,但不确定这是否是最好的方法。

于 2012-08-01T07:25:54.383 回答
8

您可以传递条件哈希:

can :manage, Article, :user_id => user.id

有关详细信息,请查看https://github.com/ryanb/cancan/wiki/defining-abilities

于 2012-08-01T07:25:46.917 回答