簡體   English   中英

CanCan索引動作能力

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM