Can can has_many通过说明帮助需要很严重

时间:2013-04-16 20:32:53

标签: ruby-on-rails-3 cancan has-many-through

亲爱的所有人(尤其是瑞恩,谢谢你们的出色工作), 我只是对可能真的很愚蠢的东西完全坚定,但对于我的生活,我无法将我的大脑包裹起来并解决它。

我正在尝试使用Can Can进行授权,并且我在所有内容上正确设置了(这是我的问题,在特定的事情上,显然工作正常,但我不确定我是否正在做是对还是不 - 实际上我认为我无法证明它不能正常工作。

让我们看看我是否能够清楚地解释我在做什么:

我有两个模型(用户和专辑),通过第三个模型分享:

(A)用户模型

has_many :albums, :dependent => :destroy # ownership
has_many :shares, :foreign_key => "shared_user_id" #, :dependent => :destroy
has_many :shared_albums, :through => :shares

(B)专辑模型

belongs_to :user
has_many :shares, :foreign_key => "shared_album_id", :dependent => :destroy
has_many :shared_users, :through => :shares

(C)分享模式

belongs_to :shared_user, :foreign_key => "shared_user_id", :class_name => "User"
belongs_to :shared_album, :foreign_key => "shared_album_id", :class_name => "Album"

现在,在我的Ability类中,我喜欢做的是限制(C)共享模型上特定用户可以执行的操作。

在我的应用中,用户可以创建相册,然后他可以将其他用户添加到该相册(此用户是唯一可以访问特定相册的用户)。此外,作为相册一部分的每个用户也可以添加新用户。

所有这一切都是为了给予相册中的用户,创建共享的能力(共享模型与用户和相册模型相关)。

现在最大的问题是,我如何限制添加(创建)共享到特定相册的能力,仅限于那些属于该专辑的用户(通过共享)?

例如我有:

users => id(1,2,3,4)[我的应用中共有4个用户]

专辑=> id(45,32)[我的应用中共有2张专辑]

shares => (专辑45 => [用户(1,2,3)];专辑32 => [用户(1,4)])[我的应用中共有5股]

我怎么能在Ability类中说专辑32(例如),只有用户1和4可以添加(创建)新共享(添加新用户),而用户2或3则可以'吨?

我已经限制了用户2和3无论如何都能访问资源专辑32的能力(我在Album类级别上这样做了),但我想确保无论出于何种原因创建用户的能力也受到限制。

到目前为止,我的能力等级是:

def initialize(user)

  (A) ALBUM LEVEL

     # (1) Every User can create Album, without restrictions
     can :create, Album   

     # (2) Only the user that own the Album can manage it
     can :manage, Album, :user_id => user.id 

     # (3) The Album can be read by all the users that are part of that specific album
     can :read, Album, :shares => {:shared_user_id => user.id}

     # (4) The Album can be read by every user if the privacy attribute is false
     can :read, Album, :privacy_setting => false


  (B) SHARE LEVEL

     # (1) Only the user that own the Album can manage all the shares for the album
     can :manage, Share, :shared_album => {:user_id => user.id}

     # (2) The other users (in the album), can just manage themself (their share)
     can :manage, Share, :shared_user_id => user.id

     # (3) The Share in the album can be read by every user if privacy is false (just read)
     can [:read], Share, :shared_album => {:privacy_setting => false}
     cannot [:create,:destroy,:delete], Share, :shared_album => {:privacy_setting => false}


 #### (X) CRUCIAL POINT CREATE NEW SHARE
     can :create, Share, :shared_album => {:shared_users => {:id => user.id}}

 end

(X)CRUCIAL POINT中的条件是否允许仅已经是相册的用户的正确条件是将新用户添加到相册???

这完全让我感到疯狂。

感谢大家,尤其是那些能让我了解更多这一切的人。

最佳

Dinuz

1 个答案:

答案 0 :(得分:0)

你的能力.rb似乎很好。

您的关键点如下:

如果该共享有共享相册,并且当前用户包含在该共享相册的shared_users中,则用户可以创建共享。

但要记住一件事。由于您在授权时检查共享的shared_album,因此必须先先设置它,然后再尝试授权。

例如:

@share = @albums.shares.build
authorize :create, @share

上面的示例将设置共享的shared_album_id,以便您可以对其进行授权。

@share = Share.new
authorize :create, @share

这不起作用,因为该分享还没有专辑。

希望这有帮助。