У меня проблемы с определением разрешений для моих альбомов # 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) будет намного быстрее и ему не придется получать (потенциально) тысячу идентификаторов из базы данных.Любое другое решение приветствуется.