[英]CanCan index action ability
我在為我的albums#index操作定義權限時遇到了麻煩。 它的路徑是/ user /:user_id / albums-這是我的:show動作(:read => [:index,:show])正常運行的能力。 它的路徑是/ user /:user_id / albums /:id /。
can :read, Album do |album|
@user.friends_with?(album.user_id)
end
我不確定如何為索引操作編寫類似的規則,或者我什至不想在這里使用CanCan。 規則是:
current_user 必須是.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
更新:事實證明,解決方案非常簡單,我只是不注意自己的路線:
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。 任何其他解決方案都是最歡迎的。
在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.