Rails: Разработайте after_sign_in_path для нескольких маршрутов ресурсов к root

Я работаю над приложением каталога библиотеки, которое аутентифицирует администраторов и пользователей. Почему-то я не могу установить after_sign_in_path_for, так как теперь вход в систему направляется в общедоступный корень, а не в корень каждого пространства имен.

Я уже реализовал пространство имен администратора и аутентификацию администратора, и все работало. Чтобы настроить путь sign_out, я добавил:

# Overwriting the sign_out redirect path method
def after_sign_out_path_for(resource_or_scope)
  if resource_or_scope == :user
    collection_path
  elsif resource_or_scope == :admin
    new_admin_session_path
  else
    root_path
  end
end

Я уже включил область пользователя в этот раздел, даже если я еще не реализовал ресурс. Все работало.

Теперь я хочу добавить пользовательский ресурс и пространство имен коллекции, в котором размещен каталог. Поскольку теперь мне нужно указать перенаправление при входе в систему, я завершил application_controller.rb с помощью:

# Overwriting the sign_in redirect path method
def after_sign_in_path_for(resource_or_scope)
  if resource_or_scope == :user
    collection_opac_path
  elsif resource_or_scope == :admin
    admin_root_path
  else
    root_path
  end
end

Почему-то меня теперь перенаправляет в основной корень вместо collection_opac_path или admin_root_path. Последнее работало до определения after_sign_in_path.

В моем route.rb у меня есть следующие записи:

devise_for :users
devise_for :admins

namespace :collection do
  match '/',                          :to => 'opac#home'
  match '/opac',                      :to => 'opac#opac', :as => :opac
  root :to => 'opac#home'
end

namespace :admin do
  ...
  root :to => 'pages#pageadmin'
end

root :to => 'pages#manifesto'

Администратор аутентифицируется на всех контроллерах пространства имен администратора. Пользователь аутентифицируется в действии opac контроллера opac в пространстве имен коллекции.

rake routes дает:

     collection    /collection(.:format)       collection/opac#home
collection_opac    /collection/opac(.:format)  collection/opac#opac
collection_root    /collection(.:format)       collection/opac#home

     admin_root    /admin(.:format)            admin/pages#pageadmin
           root    /                           pages#manifesto

Что я делаю неправильно? Как я могу заставить это работать?

Заранее спасибо!

Обновлять

Я думаю, что важно указать, что форма входа пользователя помещается в представление коллекции/домашней страницы, а при отправке и входе в систему она должна перенаправляться в коллекцию/opac, а форма входа администратора появляется при попытке доступа к корню пространства имен администратора.


person SEJU    schedule 08.02.2019    source источник
comment
как вы отличаете пользователя от пользователя / администратора, есть ли поле в пользовательских таблицах, которое может различать пользователя от пользователя / администратора   -  person widjajayd    schedule 08.02.2019
comment
У меня две разные таблицы 1) пользователи, 2) админы.   -  person SEJU    schedule 08.02.2019


Ответы (1)


Я добавил:

def after_sign_in_path_for(resource)
 stored_location_for(resource) ||
  if resource.is_a?(User)
    collection_opac_path
  elsif resource.is_a?(Admin)
    admin_root_path
  else
    super
  end
end

адаптируя то, что указано в devisegem/lib/devise/controllers/helpers.rb, и теперь условные маршруты работают.

person SEJU    schedule 08.02.2019