使用cancan让用户只管理一些模型

时间:2013-04-30 19:23:29

标签: ruby-on-rails ruby cancan

我有一个简单的公告板系统,使用rails(和设计)构建。

我想将cancan添加到系统中,但是我在定义一些规则时遇到了问题。

简而言之,我的应用程序有一个User模型,一个Forum模型和一个ForumModerationModel。 代码(简化):

class User < ActiveRecord::Base
  has_many :forum_moderations, dependent: :destroy, foreign_key: 'moderator_id'
  has_many :moderated_forums, through: :forum_moderations, source: 'moderated_forum'

class Forum < ActiveRecord::Base
  has_many :forum_moderations, dependent: :destroy

class ForumModeration < ActiveRecord::Base
  belongs_to :moderated_forum, class_name: 'Forum'
  belongs_to :moderator, class_name: 'User'

  validates_uniqueness_of :moderator_id, :scope => [:moderated_forum_id]
end

如您所见,用户可以审核N个论坛,论坛可由N个用户审核。 我的问题是:

如何根据这些模型定义cancan用户只能:manage某些论坛?

我读过这篇文章: https://github.com/ryanb/cancan/wiki/Defining-Abilities

但是由于我的用户模型没有我可以用于此目的的列,我被卡住了。

1 个答案:

答案 0 :(得分:1)

据我所知,你必须正确定义你的病情​​。您需要将current_forum变量传递给initialize方法,然后使用它来确定current_user是否可以访问此论坛上的审核。

def initialize(user, current_forum = nil)
  user ||= User.new # guest user (not logged in)
  if user.moderated_forums.include?(current_forum)
    # user is moderator
  else
    # user is not moderator
  end
end

您可以将current_forum定义为before_filter方法并输入要使用它的控制器,或放入ApplicationController并将skip_before_filter放入您不需要的控制器中