我在为我的相册#索引行动定义权限时遇到了一些问题。它的路径是/ 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。任何其他解决方案是最受欢迎的
我做了一些修改,这个答案之后,所以它不是最新的,但提出的规则仍然是我使用的。 –