Аутентификация Active Admin, конфликтующая с аутентификацией пользователя

Active Admin - это драгоценный камень, используемый для панели управления администратора в вашем приложении. Он использует Devise для входа в систему пользователей и создает отдельную модель admin_user для администраторов. Мое приложение уже использует devise и имеет своих пользователей в качестве модели user. С тех пор, как я начал использовать активный админский жемчуг, в моем файле маршрутов следующая строка продолжает разрешать поиск на домашнем # индексе, а не на панели пользователей #, даже когда мой пользователь вошел в систему. Раньше это работало нормально, когда пользователи вносили пользователей #dashboard как корневой URL.

root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
root :to => 'home#index'

Случается, что .authenticate? проверяет, что admin_user (принадлежащий Active Admin) входит в систему или нет, но не моя модель user, которую я должен проверить, поэтому, когда я вошедший в активный интерфейс администратора, мой корневой сайт сайта становится пользовательской панелью пользователей вместо этого, не проверяя, зарегистрирован ли user или нет. Как я могу сделать проверку .authenticate? для входа user, а не admin_user?

Любая помощь или подсказки будут очень оценены

Ответ 1

Я смог решить это. Эта проблема была связана с Devise, ожидающим использования одной пользовательской модели в приложении. Вот как это исправить.

В файле config/initializers/devise.rb добавьте:

config.scoped_views = true

и

config.default_scope = :user #or whichever is your regular default user model

thats it, смотритель проверяет: user для входа в систему, а не: admin_user

Ответ 2

Почему вы используете get "/"? Вы должны удалить его. Я использую определение, очень похожее на ваше, и отлично работает со мной. Используйте только:

root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
root :to => 'home#index'

Ответ 3

Я не уверен, но вы можете попробовать что-то вроде

root :to => proc { |env| [ 302, {'Location'=> env["warden"].authenticate? ? "users/dashboard" : "/home" }, [] ] }

Ответ 4

Что для меня работало:

constraint = lambda { |request| request.env["warden"].authenticate? and request.env['warden'].user.instance_of?(AdminUser) }