2011-08-03 39 views
0

我在为我的相册#索引行动定义权限时遇到了一些问题。它的路径是/ user /:user_id/albums - 这是我的:show操作(:read => [:index,:show])的功能,它运行良好。它的路径是/ user /:user_id/albums /:id /。CanCan索引行动能力

can :read, Album do |album| 
    @user.friends_with?(album.user_id) 
end 

我不知道如何为索引操作编写类似的规则,或者如果我甚至想在这里使用CanCan。规则是:

CURRENT_USER MUST是.friends_with(USER_ID)查看属于user_id说明任何相册?

user_id当然取自params [:user_id]。注意:/ user/eml/albums /将是路径,我不是通过他们的.id而是通过他们的.username获取用户!

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    @user = user || User.new # for guest, probably not needed 
    @user.roles.each { |role| send(role) } 
    end 

    def user 
    can :read, Album do |album| 
     @user.friends_with?(album.user_id) 
    end 

    can :manage, Album do |album| 
     album.user_id == @user.id 
    end 
    end 
end 

UPDATE: 原来的解决方案是非常简单的,我只是不重视我的路线:

resources users do 
    resources albums 
end 

在变得相当容易那么控制器:

load_and_authorize_resource :user, :find_by => :username 
    load_and_authorize_resource :album, :through => :user 

而规则:

can :read, Album, :user_id => @user.friend_ids # I don't need @user.id 

虽然我不完全满意,但使用user.friends_with?(other_user)方法会更快,并且不必从数据库中获取(可能)千位ID。任何其他解决方案是最受欢迎的

回答

1

在IRC上,你告诉我,.roles_mask并不重要......那么不应该这个是这样的:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    if user 
     can :read, Album, :user_id => [user.id] + user.friend_ids 
     can :manage, Album, :user_id => user.id 
    end 
    end 
end 
+0

我做了一些修改,这个答案之后,所以它不是最新的,但提出的规则仍然是我使用的。 –