我有两种模式:
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 }
但那个错误。有什么想法吗?
答案 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
中的new
和create
操作中使用此自定义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模型的属性