Хорошо, я решил проблему. Мой вариант использования кратко упоминается в начале CanCan README, и я пропустил его. Вы можете определить новые классы Ability в app / models /, которые принимают другой параметр, отличный от current_user. Для этого вы помещаете в свой контроллер следующее:
def current_ability
if params[:controller] == 'leagues'
@current_ability = LeagueAbility.new(current_user_league_relation)
elsif params[:controller] == 'league_relations'
@current_ability = LeagueRelationAbility.new(current_user_league_relation)
else
@current_ability = Ability.new(current_user)
end
end
Теперь вы можете создать league_ability.rb в приложении / models /.
class LeagueAbility
include CanCan::Ability
def initialize(league_relation)
league_relation ||= LeagueRelation.new
if league_relation.owner?
can :manage, League, :id => league_relation.league_id
elsif league_relation.moderator?
can :manage, League, :id => league_relation.league_id
cannot [:delete, :destroy], League
else
can :read, League
can :create, League
end
end
end
Стоит отметить, что это зависит от того, как контроллер приложения вызывает метод в дочернем классе. Надеюсь, это поможет!