Devise в смонтированном движке использует неверный URL для ошибки 401

Я использую Devise в смонтированном движке (my_engine) в своем приложении Rails (my_application). Это работает довольно хорошо, но все же есть одна проблема: если пользователь пытается получить доступ к ресурсу с ограниченным доступом (то есть к странице, защищенной с помощью before_filter authenticate_user!), Devise/Warden генерирует ответ 401 и перенаправляет на URL-адрес входа. К сожалению, этот URL-адрес sign_in не имеет префикса пути монтирования движка.

Итак, моя проблема заключается в том, что URL-адрес, который Devise использует для перенаправления браузера на страницу входа, неверен.

Файл routes.rb движка...

My_Engine::Engine.routes.draw do

  devise_for :users, {
                       class_name: "My_Engine::User",
                       module: :devise,
                       controllers: {registrations: 'my_engine/users/registrations'}
                     }
  devise_scope :user do
    get 'users/registrations/after_sign_up/:id' => "users/registrations#after_sign_up", as: :after_sign_up
    get 'users/registrations/after_confirm/:id' => "users/registrations#after_confirm", as: :after_confirm
  end
end

Сгенерированные маршруты все в порядке:

Prefix Verb URI Pattern Controller#Action
  my_engine      /my_engine       My_Engine::Engine

Routes for My_Engine::Engine:
        new_user_session GET    /users/sign_in(.:format)                         devise/sessions#new
            user_session POST   /users/sign_in(.:format)                         devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)                        devise/sessions#destroy
           user_password POST   /users/password(.:format)                        devise/passwords#create
       new_user_password GET    /users/password/new(.:format)                    devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)                   devise/passwords#edit
                         PATCH  /users/password(.:format)                        devise/passwords#update
                         PUT    /users/password(.:format)                        devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)                          my_engine/users/registrations#cancel
       user_registration POST   /users(.:format)                                 my_engine/users/registrations#create
   new_user_registration GET    /users/sign_up(.:format)                         my_engine/users/registrations#new
  edit_user_registration GET    /users/edit(.:format)                            my_engine/users/registrations#edit
                         PATCH  /users(.:format)                                 my_engine/users/registrations#update
                         PUT    /users(.:format)                                 my_engine/users/registrations#update
                         DELETE /users(.:format)                                 my_engine/users/registrations#destroy
       user_confirmation POST   /users/confirmation(.:format)                    devise/confirmations#create
   new_user_confirmation GET    /users/confirmation/new(.:format)                devise/confirmations#new
                         GET    /users/confirmation(.:format)                    devise/confirmations#show
           after_sign_up GET    /users/registrations/after_sign_up/:id(.:format) my_engine/users/registrations#after_sign_up
           after_confirm GET    /users/registrations/after_confirm/:id(.:format) my_engine/users/registrations#after_confirm

Теперь, когда я получаю доступ к защищенному ресурсу, Devise генерирует ошибку 401 и перенаправляет на путь входа в систему, но URL-адрес не имеет префикса «/my_engine».

Он использует /users/sign_in, но должен использовать /my_engine/users/sign_in.

19:41:11 web.1  | Started GET "/my_engine/users/edit" for ::1 at 2015-03-09 19:41:11 +0100
19:41:11 web.1  | Processing by My_Engine::Users::RegistrationsController#edit as HTML
19:41:11 web.1  | Completed 401 Unauthorized in 1ms
19:41:11 web.1  | 
19:41:11 web.1  | 
19:41:11 web.1  | Started GET "/users/sign_in" for ::1 at 2015-03-09 19:41:11 +0100
19:41:11 web.1  | 
19:41:11 web.1  | ActionController::RoutingError (No route matches [GET] "/users/sign_in"):
19:41:11 web.1  |   actionpack (4.2.0) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'

Кто-нибудь сталкивался с этим раньше? Кажется, что есть связанная проблема с omniaauthenticable в двигателях, но я не уверен, что у них одна и та же причина.


person user1576088    schedule 09.03.2015    source источник
comment
Ознакомьтесь с github.com/plataformatec/devise/wiki/, вы можете указать любой путь.   -  person Ativ    schedule 09.03.2015
comment
Спасибо, Атив. Это решило мою проблему.   -  person user1576088    schedule 10.03.2015


Ответы (1)


Посмотрите ответ Атива, который решил мою проблему.

Короче говоря, мне пришлось добавить Devise::FailureApp в папку lib движка, указать Devise использовать его и загрузить при запуске.

См. github для получения подробной информации.

person user1576088    schedule 10.03.2015
comment
Я пытаюсь сделать именно это, но я продолжаю получать неинициализированную константу CustomFailure (NameError), можете ли вы опубликовать настройку вашего движка для загрузки приложения с ошибкой? Я добавил это в свой engine.rb файл: config.autoload_paths << File.expand_path('../../lib/devise', __FILE__) безуспешно. - person Geoffrey H; 04.05.2016