diff --git a/lib/devise/failure_app.rb b/lib/devise/failure_app.rb index 4f7a3ddc8b..a815e089ff 100644 --- a/lib/devise/failure_app.rb +++ b/lib/devise/failure_app.rb @@ -142,11 +142,16 @@ def scope_url opts[:format] = request_format unless skip_format? - opts[:script_name] = relative_url_root if relative_url_root? - router_name = Devise.mappings[scope].router_name || Devise.available_router_name context = send(router_name) + if relative_url_root? + opts[:script_name] = relative_url_root + elsif defined? context.routes + rootpath = context.routes.url_helpers.root_path + opts[:script_name] = rootpath.chomp('/') unless rootpath.length <= 1 + end + if context.respond_to?(route) context.send(route, opts) elsif respond_to?(:root_url) diff --git a/test/integration/mounted_engine_test.rb b/test/integration/mounted_engine_test.rb index 98dcf47594..4f79f79dd1 100644 --- a/test/integration/mounted_engine_test.rb +++ b/test/integration/mounted_engine_test.rb @@ -1,9 +1,22 @@ require 'test_helper' -class MyMountableEngine - def self.call(env) - ['200', { 'Content-Type' => 'text/html' }, ['Rendered content of MyMountableEngine']] +module MyMountableEngine + class Engine < ::Rails::Engine + isolate_namespace MyMountableEngine end + class TestsController < ActionController::Base + def index + render plain: 'Root test successful' + end + def inner_route + render plain: 'Inner route test successful' + end + end +end + +MyMountableEngine::Engine.routes.draw do + get 'test', to: 'tests#inner_route' + root to: 'tests#index' end # If disable_clear_and_finalize is set to true, Rails will not clear other routes when calling @@ -13,7 +26,7 @@ def self.call(env) Rails.application.routes.draw do authenticate(:user) do - mount MyMountableEngine, at: '/mountable_engine' + mount MyMountableEngine::Engine, at: '/mountable_engine' end end @@ -31,6 +44,23 @@ class AuthenticatedMountedEngineTest < Devise::IntegrationTest get '/mountable_engine' assert_response :success - assert_contain 'Rendered content of MyMountableEngine' + assert_contain 'Root test successful' + end + + + test 'renders a inner route of the mounted engine when authenticated' do + sign_in_as_user + get '/mountable_engine/test' + + assert_response :success + assert_contain 'Inner route test successful' + end + + test 'respond properly to a non existing route of the mounted engine' do + sign_in_as_user + + assert_raise ActionController::RoutingError do + get '/mountable_engine/non-existing-route' + end end end