rails CanCan - 定义嵌套模型的权限

时间:2011-02-11 04:44:18

标签: ruby-on-rails ruby-on-rails-3 cancan

我有两种模式:

Thread (id, title)
ThreadParticipation (id, thread_id, user_id)

我想定义类似的内容:

can :create, ThreadParticipation if the user is a ThreadParticipation

示例:

for
    thread: (1, 'hello world')
    thread_participation: (313, 1, 13) -- where 13 is the user_id

我试过了:

can :create, ThreadParticipation, :thread_participations => { :user_id => current_user.id }

但那个错误。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

Thread通常只是一个糟糕的模型名称,因为它会与Ruby中定义的Thread类冲突。我刚刚实施了这个。在我的例子中,我有论坛和主题。一个人不应该在他们没有读取权限的论坛中创建新主题。

我在论坛对象上定义了一个名为create_topic的自定义权限:

can :create_topic, Forem::Forum do |forum|
  can?(:read, forum) && user.can_create_forem_topics?(forum)
end

can_create_forem_topics?模型刚刚在User模型上定义的地方:

def can_create_forem_topics?(forum)
  # code goes here
end

然后,我只在我的:create_topic中的newcreate操作中使用此自定义TopicsController功能,其中@forum由{{1}定义}}:

before_filter

如果我需要在视图中使用它:

authorize! :create_topic, @forum

通过在父对象上定义自定义权限,

答案 1 :(得分:0)

我目前正在尝试实现类似的功能,但我并没有完全了解这一点。试试这个:

can :create, ThreadParticipation => Thread, do |participation, thread|
  # your definition here
end

这也应该没有障碍。

编辑:删除上面的部分,但在CanCan中仍然无效。我实现了自己的解决方案,但它需要您手动授权控制器操作,这不是美化,但在我看来更安全。

我为我的项目实现了这种方式: https://gist.github.com/822208

答案 2 :(得分:0)

通常你会用户

user

不     CURRENT_USER

在ability.rb中。这是你的错误吗?你的能力也被错误地指定了。你想要

can :create, ThreadParticipation, :user_id => user.id

请注意:user_id 是ThreadParticipation模型的属性