У меня была такая же проблема только на днях.Я разобрался с решением после прочтения Readme CanCan, что вы должны сделать, если вы еще не сделали.
Вы можете просмотреть мое решение здесь: Контекстно-зависимая авторизация с использованием CanCan
Чтобы получить ответ, более конкретный для вашего варианта использования, выполните следующие действия:
В вашем контроллере приложения вам нужно определить некоторую логику, которая будет выбирать ваши способности.
class ApplicationController < ActionController::Base
check_authorization
def current_ability
if <no group selected logic> # Maybe: params[:controller] == 'groups'
@current_ability = NoGroupSelectedAbility.new(current_user)
else
@current_ability = GroupSelectedAbility.new(current_user)
end
end
# Application Controller Logic Below
end
Затем вам нужно будет создать новую способность (или способности) в вашей папке app / models /.Вы также можете делать классные вещи, как это:
if request.path_parameters[:controller] == groups
@current_ability = GroupsAbility.new(current_group_relation)
end
Где current_group_relation определяется в app / controllers / groups_controller.rb.Это даст вам определенные способности для конкретных контроллеров.Помните, что родительские классы могут вызывать методы в дочерних классах в Ruby.Вы можете определить метод в вашем контроллере и вызывать его из ApplicationController, если вы уверены, какой контроллер используется в настоящее время для обработки запроса.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ: Я хотел показать вам, как выглядит пользовательские способности.
# File path: app/models/group_ability.rb
class GroupsAbility
include CanCan::Ability
# This can take in whatever you want, you decide what to argument to
# use in your Application Controller
def initialize(group_relation)
group_relation ||= GroupRelation.new
if group_relation.id.nil?
# User does not have a relation to a group
can :read, all
elsif group_relation.moderator?
# Allow a mod to manage all group relations associated with the mod's group.
can :manage, :all, :id => group_relation.group.id
end
end
end