From cdf90bb5d9473962fc13f4f35f4b30c98e1f84ee Mon Sep 17 00:00:00 2001 From: Abe Voelker <_@abevoelker.com> Date: Sun, 17 Sep 2023 00:07:50 -0500 Subject: [PATCH] Allow Devise modules to register multiple routes --- lib/devise.rb | 22 +++++++++++++++------- lib/devise/mapping.rb | 2 +- test/devise_test.rb | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/lib/devise.rb b/lib/devise.rb index 3847e190c6..c1a97f8724 100644 --- a/lib/devise.rb +++ b/lib/devise.rb @@ -408,22 +408,30 @@ def self.add_module(module_name, options = {}) NO_INPUT << strategy if options[:no_input] if route = options[:route] + routes = {} + case route when TrueClass - key, value = module_name, [] + routes[module_name] = [] when Symbol - key, value = route, [] + routes[route] = [] when Hash - key, value = route.keys.first, route.values.flatten + routes = route else raise ArgumentError, ":route should be true, a Symbol or a Hash" end - URL_HELPERS[key] ||= [] - URL_HELPERS[key].concat(value) - URL_HELPERS[key].uniq! + routes.each do |key, value| + URL_HELPERS[key] ||= [] + URL_HELPERS[key].concat(value) + URL_HELPERS[key].uniq! + + ROUTES[module_name] = key + end - ROUTES[module_name] = key + if routes.size > 1 + ROUTES[module_name] = routes.keys + end end if options[:model] diff --git a/lib/devise/mapping.rb b/lib/devise/mapping.rb index 7c7ea0085b..9396187f39 100644 --- a/lib/devise/mapping.rb +++ b/lib/devise/mapping.rb @@ -92,7 +92,7 @@ def no_input_strategies end def routes - @routes ||= ROUTES.values_at(*self.modules).compact.uniq + @routes ||= ROUTES.values_at(*self.modules).compact.flatten.uniq end def authenticatable? diff --git a/test/devise_test.rb b/test/devise_test.rb index 532aa57dc6..ed34c95601 100644 --- a/test/devise_test.rb +++ b/test/devise_test.rb @@ -84,6 +84,21 @@ class DeviseTest < ActiveSupport::TestCase assert_equal :fruits, Devise::CONTROLLERS[:kivi] Devise::ALL.delete(:kivi) Devise::CONTROLLERS.delete(:kivi) + + Devise.add_module(:apple, route: true) + assert_equal :apple, Devise::ROUTES[:apple] + Devise::ALL.delete(:apple) + Devise::ROUTES.delete(:apple) + + Devise.add_module(:pineapple, route: { session: [nil, :new] }) + assert_equal :session, Devise::ROUTES[:pineapple] + Devise::ALL.delete(:pineapple) + Devise::ROUTES.delete(:pineapple) + + Devise.add_module(:mango, route: { checkout: [nil, :show], session: [nil, :new] }) + assert_equal [:checkout, :session], Devise::ROUTES[:mango] + Devise::ALL.delete(:mango) + Devise::ROUTES.delete(:mango) end test 'should complain when comparing empty or different sized passes' do