我有一个简单的公告板系统,使用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
但是由于我的用户模型没有我可以用于此目的的列,我被卡住了。
答案 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
放入您不需要的控制器中