CanCan индексная способность действия - PullRequest
0 голосов
/ 03 августа 2011

У меня проблемы с определением разрешений для моих альбомов # index action.Путь к нему - / user /: user_id / album - это возможность для моего: show action (: 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, конечно, принимаетсяиз параметров [: user_id].Примечание: / user / eml / album / - это путь, я выбираю не пользователей по их .id, а по имени .user!

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

IЯ не совсем доволен этим, так как использование метода user.friends_with? (other_user) будет намного быстрее и ему не придется получать (потенциально) тысячу идентификаторов из базы данных.Любое другое решение приветствуется.

1 Ответ

1 голос
/ 03 августа 2011

На 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
...