2011-02-11 78 views
1

我有两个型号:轨惨惨 - 定义权限嵌套模型

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 } 

但那个错误。有任何想法吗?

+1

的财产是它一个非常非常非常非常非常严重的错误? :D如果没有一些错误信息,很难诊断! – Zabba

回答

0

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

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

这也应该没有阻止。

编辑:放下上面的部分,这还没有在CanCan中工作。我实现了我自己的解决方案,但它需要您手动授权控制器操作,这不像美化,但在我看来更安全。

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

+0

谢谢,但我很困惑。 CanCan支持或不支持?我真的希望CanCan解决方案不会增加复杂性... – AnApprentice

+0

CanCan目前不支持嵌套资源(IMO)。主要解决方案是一个CanCan解决方案,再看一遍。我只是不使用可以吗? ...在我的意见,但user_ability.can?因为可以吗?你只能接受一个参数(current_user或其他)。如果你自己创造一个能力,你可以定义更多的(比如在我的例子中,用户和公司),并且可以在这个上面工作。 – pduersteler

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在我的TopicsController中的newcreate操作中的能力,其中@forumbefore_filter

authorize! :create_topic, @forum 

如果我需要使用它的观点:由父对象上定义自定义权限

can? :create_topic, @forum 

0

通常你会用户

user 

不是 current_user

within ability.rb。这是你的错误吗?以及你的能力被错误地指定。你想

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

注意:USER_ID是ThreadParticipation模型