mirror of
https://github.com/heartcombo/devise.git
synced 2022-11-09 12:18:31 -05:00
Use router_name from scope if available
Devise.available_router_name currently returns either Devise.router_name or :main_app. As such, any redirecting is done within either of those contexts. Which leads to undesirable redirects for scopes that reside in an isolate_namespace mounted engine. This commit makes it possible for FailureApp’s redirect behavior to be performed in the context of the router_name given to devise_for. Test case added to cover undesirable behavior. Without change to lib/devise/failure_app.rb, test case throws exception.
This commit is contained in:
parent
79c6f47ad3
commit
15d3fc497c
2 changed files with 25 additions and 1 deletions
|
@ -120,7 +120,8 @@ module Devise
|
||||||
opts[:script_name] = config.relative_url_root
|
opts[:script_name] = config.relative_url_root
|
||||||
end
|
end
|
||||||
|
|
||||||
context = send(Devise.available_router_name)
|
router_name = Devise.mappings[scope].router_name || Devise.available_router_name
|
||||||
|
context = send(router_name)
|
||||||
|
|
||||||
if context.respond_to?(route)
|
if context.respond_to?(route)
|
||||||
context.send(route, opts)
|
context.send(route, opts)
|
||||||
|
|
|
@ -26,6 +26,22 @@ class FailureTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class FakeEngineApp < Devise::FailureApp
|
||||||
|
class FakeEngine
|
||||||
|
def new_user_on_engine_session_url _
|
||||||
|
'/user_on_engines/sign_in'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def main_app
|
||||||
|
raise 'main_app router called instead of fake_engine'
|
||||||
|
end
|
||||||
|
|
||||||
|
def fake_engine
|
||||||
|
@fake_engine ||= FakeEngine.new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.context(name, &block)
|
def self.context(name, &block)
|
||||||
instance_eval(&block)
|
instance_eval(&block)
|
||||||
end
|
end
|
||||||
|
@ -85,6 +101,13 @@ class FailureTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test 'returns to the default redirect location considering the router for supplied scope' do
|
||||||
|
call_failure app: FakeEngineApp, 'warden.options' => { scope: :user_on_engine }
|
||||||
|
assert_equal 302, @response.first
|
||||||
|
assert_equal 'You need to sign in or sign up before continuing.', @request.flash[:alert]
|
||||||
|
assert_equal 'http://test.host/user_on_engines/sign_in', @response.second['Location']
|
||||||
|
end
|
||||||
|
|
||||||
if Rails.application.config.respond_to?(:relative_url_root)
|
if Rails.application.config.respond_to?(:relative_url_root)
|
||||||
test 'returns to the default redirect location considering the relative url root' do
|
test 'returns to the default redirect location considering the relative url root' do
|
||||||
swap Rails.application.config, relative_url_root: "/sample" do
|
swap Rails.application.config, relative_url_root: "/sample" do
|
||||||
|
|
Loading…
Reference in a new issue