Система ролей пользователей Rails — один и тот же пользователь с несколькими правами на разных сайтах

У меня есть Rails-приложение, которое обслуживает разные сайты. Например.

  • www.example1.com
  • www.example2.com

Эти сайты хранятся в Site-модели. Также я настроил систему ролей пользователей, используя Devise, Rolify и cancancan.

Теперь у одного пользователя могут быть разные роли на разных сайтах. Например, он может быть администратором на www.example1.com, но только простым пользователем на www.example2.com.

Я загружаю разрешения пользователей в модели способностей. Теперь мой вопрос: Где вызывается эта "инициализация"-функция? Мне нужно дать этой функции дополнительный параметр site_id, чтобы загружались только соответствующие права сайта, а не один из другая сторона. Как это сделать?

models/ability.rb

class Ability
  include CanCan::Ability
  # From where is this function called, and how can I adjust this call? 
  def initialize(user, site_id) 
    return false unless user.present?
    user_role = user.users_roles.find_by(site_id: site_id).try(:role)
    user_role.permissions.each do |p|
      if p.permission_subject_id.nil?
        can p.permission_action.to_sym, p.permission_subject_class.constantize
      else
        can p.permission_action.to_sym, p.permission_subject_class.constantize, id: p.subject_id
      end
    end unless user_role.nil?
  end
end

person Michael B    schedule 04.12.2015    source источник


Ответы (1)


Это инициализируется с помощью метода current_ability. Поэтому вам нужно перезаписать этот помощник в application_controller вот так

class ApplicationController < ActionController::Base
  #...

  private

  def current_ability
    @current_ability ||= Ability.new(current_user, request. original_url)
  end
end
person coderhs    schedule 04.12.2015