#ruby-on-rails #devise #routes #ruby-on-rails-3.1 #activeadmin
#ruby-on-rails #разработать #ruby-on-rails-3.1 #activeadmin #надзиратель
Вопрос:
Active Admin — это драгоценный камень, используемый для создания панели администратора в вашем приложении. Он использует Devise для входа пользователей в систему и создает отдельную admin_user
модель для администраторов. Мое приложение уже использует devise и использует своих пользователей в качестве user
модели. С тех пор, как я начал использовать active admin gem, в моем файле routes следующая строка продолжает разрешаться в home #index, а не в users#dashboard, даже когда мой пользователь вошел в систему. Раньше это работало нормально, когда зарегистрированные пользователи попадали в users#dashboard в качестве корневого URL.
root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
root :to => 'home#index'
Происходит то, что .authenticate?
проверяется, входит ли в систему admin_user
(принадлежит активному администратору) или нет, но не моя user
модель, что мне нужно проверить, поэтому, когда я вхожу в активный интерфейс администратора, корень моего сайта становится users #dashboard вместо этого, не проверяя, user
вошел ли он в системуили нет. Как я могу сделать .authenticate?
проверку на user
вход в систему и нет admin_user
?
Любая помощь или подсказки будут очень признательны
Комментарии:
1. На самом деле кажется, что я получаю эту проблему из-за Active Admin и того факта, что он использует Devise. Вход в интерфейс активного администратора влияет на поведение таким образом, что приложение пытается перевести каждого пользователя на панель мониторинга, если активный администратор вошел в систему, и каждого пользователя в индекс home #, если активный администратор вышел из системы, независимо от того, вошел ли в систему сам обычный пользователь или нет
2. Любая помощь или подсказки будут очень признательны
3. раздел текущего пользователя в config/initializers/active_admin.rb
4. На самом деле это уже установлено
config.current_user_method = :current_admin_user
, что отличается отcurrent_user
используемого во всем приложении. Дело в том, что Devise использует Warden, и приведенная выше команда, которую я использую в файле маршрутов, зависит от Warden. Если бы была другая команда, которую я мог бы использовать, которая была более специфичной для того, какого пользователя использовать, это сделало бы это намного проще :/5. перенаправление на корневой_путь, если warden.user.is_admin?
Ответ №1:
Я смог решить эту проблему. Проблема была связана с ожиданием разработки однопользовательской модели в приложении. Вот как это исправить.
В config/initializers/devise.rb
файле добавьте:
config.scoped_views = true
и
config.default_scope = :user #or whichever is your regular default user model
вот и все, надзиратель проверяет:user для входа в систему, а не:admin_user
Ответ №2:
Почему вы используете get "/"
? Вы должны удалить его. Я использую определение, очень похожее на ваше, и оно отлично работает со мной. Используйте только:
root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
root :to => 'home#index'
Комментарии:
1. Я тоже пробовал это, но это все равно всегда приводит меня к home#index. Похоже
lambda {|r| r.env["warden"].authenticate? }
, что для меня всегда возвращается false, независимо от того, зарегистрирован пользователь или нет.
Ответ №3:
Я не уверен, но вы можете попробовать что-то вроде
root :to => proc { |env| [ 302, {'Location'=> env["warden"].authenticate? ? "users/dashboard" : "/home" }, [] ] }
Комментарии:
1. Я пытался использовать
root :to => proc { |env| [ 302, {'Location'=> env["warden"].authenticate? ? "users/dashboard" : "/home/index" }, [] ] }
, но он всегда пытается перенаправить меня в /home/index независимо от того, вошел пользователь в систему или нет. Я подозреваю, что что-то не так с аутентификацией? команда, возможно, всегда приводит к false2. Я не знаком с Warden, но вы можете глубоко изучить его исходный код для реализации
authenticate?
в вашем процессе. Илиenv["warden"]
возвращает не то, что ожидалось.
Ответ №4:
Что сработало для меня, так это:
constraint = lambda { |request| request.env["warden"].authenticate? and request.env['warden'].user.instance_of?(AdminUser) }