ActiveAdmin - настройка отображаемых записей - PullRequest
1 голос
/ 11 октября 2011

Итак, у меня есть приложение, в котором пользователи (Devise) могут видеть либо все, либо подмножество основной модели (в данном случае «Школы»), в зависимости от того, находится ли пользователь на уровне филиала, региона или страны.

Branch belongs_to Region
School belongs_to Branch

То, что я хотел бы сделать, - это иметь возможность связывать разрешения (возможно, с областью действия) таким образом, чтобы быть прозрачным для ActiveAdmin.Пользователь входит в ActiveAdmin и получает список только школ, которые ему разрешено видеть.

Так что я думаю, это может быть решение ActiveAdmin или что-то более низкого уровня.

Любые идеи очень приветствуются:)

1 Ответ

6 голосов
/ 12 октября 2011

Вы можете настроить его так, чтобы у пользователя была полиморфная ассоциация со школой, филиалом или регионом. Если эта ассоциация равна нулю, это будет означать, что пользователь имеет доступ ко всему (упомянутый вами национальный уровень).

class User < ActiveRecord::Base
  belongs_to :administrates, :polymorphic => true
end

class School < ActiveRecord::Base
  belongs_to :branch
  has_many :users, :as => :administrates
end

class Branch < ActiveRecord::Base
  belongs_to :region
  has_many :schools
  has_many :users, :as => :administrates
end

class Region < ActiveRecord::Base
  has_many :branches
  has_many :users, :as => :administrates
end

Вы не можете сделать его полностью прозрачным для Active Admin, так как вы должны указать Active Admin использовать конкретную область. Для этого вы должны быть в состоянии обойтись с scope_to внутри ваших ActiveAdmin.register блоков. Вы должны сделать немного магии, чтобы заставить scope_to работать с полиморфной ассоциацией, но это выполнимо:

ActiveAdmin.register School do
  scope_to do
    Class.new do
      def self.schools
        case current_user.administrates
        when School
          School.where(:id => current_user.administrates_id)
        when Branch
          School.where(:branch_id => current_user.administrates_id)
        when Region
          School.where(:branch_id => current_user.administrates.branches.map(&:id))
        when NilClass
          School.scoped
        end
      end
    end
  end
end

Это в основном означает, что каждый раз, когда Active Admin будет загружать школу (или список школ на странице индекса), он будет охватывать ее через анонимный класс, который мы создали в блоке scope_to.

Вы должны иметь возможность реализовать нечто подобное на моделях Branch и Region в зависимости от ваших требований.

Вы должны знать, однако, что в настоящее время открытая проблема при использовании scope_to в отношении фильтров и форм, отображающих ресурсы вне области действия текущего пользователя.

Вам также необходима авторизация для ограничения пользователей на определенном уровне, чтобы видеть только этот уровень и ниже (например, пользователи на уровне филиала не должны иметь доступа к регионам). Для этого вы должны использовать CanCan .

Для получения информации о том, как интегрировать CanCan в Active Admin, см. this или this .

...