spree_auth_devise 4.0.0.rc1 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of spree_auth_devise might be problematic. Click here for more details.

Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +41 -0
  3. data/.gitignore +1 -0
  4. data/.travis.yml +30 -42
  5. data/Appraisals +3 -19
  6. data/Gemfile +1 -1
  7. data/README.md +3 -12
  8. data/Rakefile +9 -3
  9. data/app/controllers/metal_decorator.rb +3 -1
  10. data/app/controllers/spree/api/v2/storefront/account_confirmations_controller.rb +20 -0
  11. data/app/controllers/spree/api/v2/storefront/passwords_controller.rb +35 -0
  12. data/app/controllers/spree/user_confirmations_controller.rb +24 -0
  13. data/app/controllers/spree/user_passwords_controller.rb +3 -1
  14. data/app/controllers/spree/user_registrations_controller.rb +27 -1
  15. data/app/controllers/spree/user_sessions_controller.rb +23 -1
  16. data/app/mailers/spree/user_mailer.rb +6 -2
  17. data/app/models/spree/user.rb +17 -0
  18. data/app/services/spree/account/create.rb +19 -0
  19. data/app/services/spree/account/update.rb +17 -0
  20. data/app/views/spree/user_mailer/confirmation_instructions.text.erb +3 -3
  21. data/app/views/spree/user_mailer/reset_password_instructions.text.erb +2 -7
  22. data/app/views/spree/user_passwords/edit.html.erb +20 -17
  23. data/app/views/spree/user_passwords/new.html.erb +17 -15
  24. data/app/views/spree/user_registrations/new.html.erb +12 -17
  25. data/app/views/spree/user_sessions/new.html.erb +11 -12
  26. data/config/locales/de.yml +18 -0
  27. data/config/locales/en.yml +10 -3
  28. data/config/locales/zh-TW.yml +60 -0
  29. data/config/routes.rb +12 -3
  30. data/db/migrate/20120203010234_add_reset_password_sent_at_to_spree_users.rb +2 -2
  31. data/gemfiles/{spree_3_5.gemfile → spree_4_1.gemfile} +1 -1
  32. data/lib/controllers/api/spree/api/v2/storefront/account_controller_decorator.rb +41 -0
  33. data/lib/controllers/frontend/spree/checkout_controller_decorator.rb +2 -2
  34. data/lib/controllers/frontend/spree/users_controller.rb +5 -5
  35. data/lib/generators/spree/auth/install/install_generator.rb +0 -4
  36. data/lib/spree/auth/engine.rb +14 -1
  37. data/lib/spree/testing_support/auth_helpers.rb +36 -0
  38. data/lib/spree/testing_support/checkout_helpers.rb +24 -0
  39. data/lib/views/backend/spree/admin/user_passwords/new.html.erb +1 -1
  40. data/lib/views/backend/spree/admin/user_sessions/new.html.erb +1 -1
  41. data/spec/controllers/spree/admin/orders_controller_spec.rb +1 -1
  42. data/spec/controllers/spree/admin/user_sessions_controller_spec.rb +1 -1
  43. data/spec/controllers/spree/api/v2/storefront/passwords_controller_spec.rb +63 -0
  44. data/spec/controllers/spree/checkout_controller_spec.rb +15 -16
  45. data/spec/controllers/spree/products_controller_spec.rb +1 -1
  46. data/spec/controllers/spree/user_passwords_controller_spec.rb +4 -4
  47. data/spec/controllers/spree/user_registrations_controller_spec.rb +8 -8
  48. data/spec/controllers/spree/user_sessions_controller_spec.rb +17 -17
  49. data/spec/controllers/spree/users_controller_spec.rb +4 -4
  50. data/spec/features/account_spec.rb +10 -8
  51. data/spec/features/admin/password_reset_spec.rb +2 -4
  52. data/spec/features/admin/sign_in_spec.rb +13 -9
  53. data/spec/features/admin/sign_out_spec.rb +1 -1
  54. data/spec/features/admin_permissions_spec.rb +1 -1
  55. data/spec/features/change_email_spec.rb +1 -7
  56. data/spec/features/checkout_spec.rb +38 -63
  57. data/spec/features/confirmation_spec.rb +3 -5
  58. data/spec/features/order_spec.rb +9 -15
  59. data/spec/features/password_reset_spec.rb +2 -4
  60. data/spec/features/sign_in_spec.rb +21 -17
  61. data/spec/features/sign_out_spec.rb +14 -23
  62. data/spec/features/sign_up_spec.rb +6 -4
  63. data/spec/mailers/user_mailer_spec.rb +3 -3
  64. data/spec/models/user_spec.rb +9 -7
  65. data/spec/requests/spree/api/v2/storefront/account_confirmation_spec.rb +48 -0
  66. data/spec/requests/spree/api/v2/storefront/account_spec.rb +101 -0
  67. data/spec/spec_helper.rb +7 -22
  68. data/spree_auth_devise.gemspec +6 -24
  69. metadata +40 -334
  70. data/app/overrides/auth_shared_login_bar.rb +0 -6
  71. data/app/views/spree/shared/_login.html.erb +0 -18
  72. data/app/views/spree/shared/_user_form.html.erb +0 -17
  73. data/gemfiles/spree_3_2.gemfile +0 -8
  74. data/gemfiles/spree_3_7.gemfile +0 -9
  75. data/gemfiles/spree_4_0.gemfile +0 -8
  76. data/lib/assets/javascripts/spree/backend/spree_auth.js.erb +0 -1
  77. data/lib/assets/javascripts/spree/frontend/account.js +0 -8
  78. data/lib/assets/javascripts/spree/frontend/spree_auth.js.erb +0 -2
  79. data/lib/assets/stylesheets/spree/backend/spree_auth.css.erb +0 -3
  80. data/lib/assets/stylesheets/spree/frontend/spree_auth.css.erb +0 -3
  81. data/lib/controllers/frontend/spree/store_controller_decorator.rb +0 -7
  82. data/lib/views/frontend/spree/checkout/_new_user.html.erb +0 -20
  83. data/lib/views/frontend/spree/checkout/registration.html.erb +0 -25
  84. data/lib/views/frontend/spree/shared/_link_to_account.html.erb +0 -6
  85. data/lib/views/frontend/spree/users/edit.html.erb +0 -17
  86. data/lib/views/frontend/spree/users/show.html.erb +0 -48
  87. data/spec/support/add_to_cart.rb +0 -15
  88. data/spec/support/authentication_helpers.rb +0 -14
  89. data/spec/support/cache_helpers.rb +0 -5
  90. data/spec/support/capybara.rb +0 -16
  91. data/spec/support/database_cleaner.rb +0 -17
  92. data/spec/support/factory_girl.rb +0 -5
  93. data/spec/support/spree.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 904e54a1d9b6ad58df3685c412031328c5eb7d2a3bde8c1d3682656adb8d91ba
4
- data.tar.gz: 25ab57e3858000af1e81c594c8d01dde94d355b0f7379b38d399c914754fa4b5
3
+ metadata.gz: 118d51e3f609cac9bc6a69453d96893824814d99a44e8be828741ebd410c9aa9
4
+ data.tar.gz: dcb44d6ef585b73b82665d12b04821e5f9d6393ef87626cbbd4091e060390365
5
5
  SHA512:
6
- metadata.gz: eb3236f668fcaab30ac537ef5b8072082d00d0e205f432671c0e37a7af838b3ec13eb62563daef69b816aad29113521e0b743e386e87335a0fa6e70e7b65d0cd
7
- data.tar.gz: 2f82564fcf9e5e7c36d38611fa45965922e02593b69caf1b2068224e4dd6f20fcbc1a6e5590741e7af5180777751e17525a9fe65a25f4091dcda9d11214e91b1
6
+ metadata.gz: 0e3de0c4e4fd5adf202a9fa312f6025eaef63d9b61c8024703b418dc911d9dab405c76d3c25c6ed3f7e7d84f1bb867c2874a21e08dad903618c8632cf087531a
7
+ data.tar.gz: d650a6a697c44abba86562a2bc94b98ba117ce74a4a57f614f6e210690ea4f44f8e21f64aaf8a55458b8323b0e8686a48f3b313453337635aae8ffd2fe944dc3
@@ -0,0 +1,41 @@
1
+ version: 2
2
+
3
+ jobs:
4
+ update_staging_repository:
5
+ docker:
6
+ - image: circleci/ruby:2.6.3
7
+ steps:
8
+ - add_ssh_keys:
9
+ fingerprints:
10
+ - 54:50:5e:4e:80:6d:2e:26:43:c6:99:bd:39:b2:71:dc
11
+ - run: mkdir -p ~/.ssh
12
+ - run: ssh-keyscan -H github.com >> ~/.ssh/known_hosts
13
+ - run: ssh-add -D
14
+ - run: ssh-add ~/.ssh/id_rsa_54505e4e806d2e2643c699bd39b271dc
15
+ - run: git clone -b master git@github.com:spark-solutions/spree-designs.git
16
+ - run: gem install bundler -v 1.17.3
17
+ - run:
18
+ command: bundle update spree_auth_devise
19
+ working_directory: ~/project/spree-designs
20
+ - run:
21
+ command: |
22
+ git config user.name 'AutoDeploy'
23
+ git config user.email 'autodeploy@sparksolutions.co'
24
+ working_directory: ~/project/spree-designs
25
+ - run:
26
+ command: |
27
+ git add -A
28
+ git commit -m "Auto-commit v#${CIRCLE_BUILD_NUM}"
29
+ working_directory: ~/project/spree-designs
30
+ - run:
31
+ command: git push origin master
32
+ working_directory: ~/project/spree-designs
33
+
34
+ workflows:
35
+ version: 2
36
+ update_staging_repository:
37
+ jobs:
38
+ - update_staging_repository:
39
+ filters:
40
+ branches:
41
+ only: master
data/.gitignore CHANGED
@@ -20,3 +20,4 @@ public/spree
20
20
  .ruby-gemset
21
21
  gemfiles/*.gemfile.lock
22
22
  *.gem
23
+ .bundle
@@ -1,56 +1,44 @@
1
- sudo: required
2
- dist: trusty
3
-
4
- script:
5
- - bundle exec rake test_app
6
- - bundle exec rake spec
1
+ os: linux
2
+ dist: bionic
7
3
 
8
4
  addons:
9
- chrome: stable
10
- postgresql: 9.4
5
+ apt:
6
+ sources:
7
+ - google-chrome
8
+ packages:
9
+ - google-chrome-stable
11
10
 
12
- env:
13
- - DB=mysql
14
- - DB=postgres
11
+ services:
12
+ - mysql
13
+ - postgresql
15
14
 
16
15
  language: ruby
17
16
 
18
17
  rvm:
19
- - 2.5.1
20
- - 2.4.4
21
- - 2.3.7
18
+ - 2.5
19
+ - 2.6
20
+
21
+ env:
22
+ - DB=mysql
23
+ - DB=postgres
22
24
 
23
25
  gemfile:
24
- - gemfiles/spree_3_2.gemfile
25
- - gemfiles/spree_3_5.gemfile
26
- - gemfiles/spree_3_7.gemfile
27
- - gemfiles/spree_4_0.gemfile
26
+ - gemfiles/spree_4_1.gemfile
28
27
  - gemfiles/spree_master.gemfile
29
28
 
30
- matrix:
31
- allow_failures:
32
- - gemfile: gemfiles/spree_master.gemfile
33
- exclude:
34
- - rvm: 2.3.7
35
- gemfile: gemfiles/spree_4_0.gemfile
36
- - rvm: 2.4.4
37
- gemfile: gemfiles/spree_4_0.gemfile
38
- - rvm: 2.3.7
39
- gemfile: gemfiles/spree_master.gemfile
40
- - rvm: 2.4.4
41
- gemfile: gemfiles/spree_master.gemfile
42
- - rvm: 2.5.1
43
- gemfile: gemfiles/spree_3_2.gemfile
44
- - rvm: 2.5.1
45
- gemfile: gemfiles/spree_3_2.gemfile
46
- - rvm: 2.5.1
47
- gemfile: gemfiles/spree_3_5.gemfile
29
+ jobs:
30
+ allow_failures:
31
+ - gemfile: gemfiles/spree_master.gemfile
48
32
 
49
33
  before_install:
50
34
  - mysql -u root -e "GRANT ALL ON *.* TO 'travis'@'%';"
51
- - wget -N https://chromedriver.storage.googleapis.com/2.35/chromedriver_linux64.zip -P ~/
52
- - unzip ~/chromedriver_linux64.zip -d ~/
53
- - rm ~/chromedriver_linux64.zip
54
- - sudo mv -f ~/chromedriver /usr/local/share/
55
- - sudo chmod +x /usr/local/share/chromedriver
56
- - sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
35
+
36
+ before_script:
37
+ - CHROME_MAIN_VERSION=`google-chrome-stable --version | sed -E 's/(^Google Chrome |\.[0-9]+ )//g'`
38
+ - CHROMEDRIVER_VERSION=`curl -s "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$CHROME_MAIN_VERSION"`
39
+ - curl "https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip" -O
40
+ - unzip chromedriver_linux64.zip -d ~/bin
41
+
42
+ script:
43
+ - bundle exec rake test_app
44
+ - bundle exec rake spec
data/Appraisals CHANGED
@@ -1,25 +1,9 @@
1
- appraise 'spree-3-2' do
2
- gem 'spree', '~> 3.2.0'
3
- gem 'rails-controller-testing'
4
- end
5
-
6
- appraise 'spree-3-5' do
7
- gem 'spree', '~> 3.5.0'
8
- gem 'rails-controller-testing'
9
- end
10
-
11
- appraise 'spree-3-7' do
12
- gem 'sass-rails'
13
- gem 'spree', '~> 3.7.0.rc3'
14
- gem 'rails-controller-testing'
15
- end
16
-
17
- appraise 'spree-4-0' do
18
- gem 'spree', github: 'spree/spree', tag: 'v4.0.0.beta'
1
+ appraise 'spree-4-1' do
19
2
  gem 'rails-controller-testing'
3
+ gem 'spree', '~> 4.1'
20
4
  end
21
5
 
22
6
  appraise 'spree-master' do
23
- gem 'spree', github: 'spree/spree', branch: 'master'
24
7
  gem 'rails-controller-testing'
8
+ gem 'spree', github: 'spree/spree', branch: 'master'
25
9
  end
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem "rails-controller-testing"
3
+ gem 'rails-controller-testing'
4
4
  gem 'spree', github: 'spree/spree', branch: 'master'
5
5
 
6
6
  gemspec
data/README.md CHANGED
@@ -10,20 +10,11 @@ Provides authentication services for [Spree](https://spreecommerce.org), using t
10
10
 
11
11
  1. Add this extension to your Gemfile with this line:
12
12
 
13
- #### Spree >= 3.1
14
-
15
- ```ruby
16
- gem 'spree_auth_devise', '~> 3.3'
17
- ```
18
-
19
- #### Spree 3.0 and Spree 2.x
20
-
21
13
  ```ruby
22
- gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'X-X-stable'
14
+ gem 'spree_auth_devise'
23
15
  ```
24
-
25
- The `branch` option is important: it must match the version of Spree you're using.
26
- For example, use `3-0-stable` if you're using Spree `3-0-stable` or any `3.0.x` version.
16
+
17
+ if you run into any version-mismatch problems please run `bundle update`
27
18
 
28
19
  2. Install the gem using Bundler:
29
20
  ```ruby
data/Rakefile CHANGED
@@ -2,14 +2,20 @@ require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
3
 
4
4
  require 'rspec/core/rake_task'
5
- require 'spree/testing_support/common_rake'
5
+ require 'spree/testing_support/extension_rake'
6
6
 
7
7
  RSpec::Core::RakeTask.new
8
8
 
9
- task default: :spec
9
+ task :default do
10
+ if Dir["spec/dummy"].empty?
11
+ Rake::Task[:test_app].invoke
12
+ Dir.chdir("../../")
13
+ end
14
+ Rake::Task[:spec].invoke
15
+ end
10
16
 
11
17
  desc 'Generates a dummy app for testing'
12
18
  task :test_app do
13
19
  ENV['LIB_NAME'] = 'spree/auth'
14
- Rake::Task['common:test_app'].invoke("Spree::User")
20
+ Rake::Task['extension:test_app'].invoke
15
21
  end
@@ -1,5 +1,5 @@
1
1
  # For the API
2
- ActionController::Metal.class_eval do
2
+ module MetalDecorator
3
3
  def spree_current_user
4
4
  @spree_current_user ||= if defined? env
5
5
  env['warden'].user
@@ -8,3 +8,5 @@ ActionController::Metal.class_eval do
8
8
  end
9
9
  end
10
10
  end
11
+
12
+ ActionController::Metal.prepend(MetalDecorator)
@@ -0,0 +1,20 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class AccountConfirmationsController < ::Spree::Api::V2::BaseController
6
+
7
+ def show
8
+ user = Spree.user_class.confirm_by_token(params[:id])
9
+
10
+ if user.errors.empty?
11
+ render json: { data: { state: user.respond_to?(:state) ? user.state : '' } }, status: :ok
12
+ else
13
+ render json: { error: user.errors.full_messages.to_sentence }, status: :unprocessable_entity
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class PasswordsController < ::Spree::Api::V2::BaseController
6
+ include Spree::Core::ControllerHelpers::Store
7
+
8
+ def create
9
+ user = Spree.user_class.find_by(email: params[:user][:email])
10
+
11
+ if user&.send_reset_password_instructions(current_store)
12
+ head :ok
13
+ else
14
+ head :not_found
15
+ end
16
+ end
17
+
18
+ def update
19
+ user = Spree.user_class.reset_password_by_token(
20
+ password: params[:user][:password],
21
+ password_confirmation: params[:user][:password_confirmation],
22
+ reset_password_token: params[:id]
23
+ )
24
+
25
+ if user.errors.empty?
26
+ head :ok
27
+ else
28
+ render json: { error: user.errors.full_messages.to_sentence }, status: :unprocessable_entity
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -6,6 +6,30 @@ class Spree::UserConfirmationsController < Devise::ConfirmationsController
6
6
  include Spree::Core::ControllerHelpers::Order
7
7
  include Spree::Core::ControllerHelpers::Store
8
8
 
9
+ before_action :set_current_order
10
+
11
+ # GET /resource/confirmation?confirmation_token=abcdef
12
+ def show
13
+ self.resource = resource_class.confirm_by_token(params[:confirmation_token])
14
+ yield resource if block_given?
15
+
16
+ if resource.errors.empty?
17
+ set_flash_message!(:notice, :confirmed)
18
+ respond_with_navigational(resource) do
19
+ redirect_to after_confirmation_path_for(resource_name, resource)
20
+ end
21
+ elsif resource.confirmed?
22
+ set_flash_message(:error, :already_confirmed)
23
+ respond_with_navigational(resource) do
24
+ redirect_to after_confirmation_path_for(resource_name, resource)
25
+ end
26
+ else
27
+ respond_with_navigational(resource.errors, status: :unprocessable_entity) do
28
+ render :new
29
+ end
30
+ end
31
+ end
32
+
9
33
  protected
10
34
 
11
35
  def after_confirmation_path_for(resource_name, resource)
@@ -10,6 +10,8 @@ class Spree::UserPasswordsController < Devise::PasswordsController
10
10
  include SpreeI18n::ControllerLocaleHelper
11
11
  end
12
12
 
13
+ before_action :set_current_order
14
+
13
15
  # Overridden due to bug in Devise.
14
16
  # respond_with resource, :location => new_session_path(resource_name)
15
17
  # is generating bad url /session/new.user
@@ -18,7 +20,7 @@ class Spree::UserPasswordsController < Devise::PasswordsController
18
20
  # respond_with resource, :location => spree.login_path
19
21
  #
20
22
  def create
21
- self.resource = resource_class.send_reset_password_instructions(params[resource_name])
23
+ self.resource = resource_class.send_reset_password_instructions(params[resource_name], current_store)
22
24
 
23
25
  if resource.errors.empty?
24
26
  set_flash_message(:notice, :send_instructions) if is_navigational_format?
@@ -11,6 +11,7 @@ class Spree::UserRegistrationsController < Devise::RegistrationsController
11
11
  end
12
12
 
13
13
  before_action :check_permissions, only: [:edit, :update]
14
+ before_action :set_current_order
14
15
  skip_before_action :require_no_authentication
15
16
 
16
17
  # GET /resource/sign_up
@@ -29,7 +30,7 @@ class Spree::UserRegistrationsController < Devise::RegistrationsController
29
30
  set_flash_message :notice, :signed_up
30
31
  sign_up(resource_name, resource)
31
32
  session[:spree_user_signup] = true
32
- respond_with resource, location: after_sign_up_path_for(resource)
33
+ redirect_to_checkout_or_account_path(resource)
33
34
  else
34
35
  set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}"
35
36
  expire_data_after_sign_in!
@@ -75,9 +76,34 @@ class Spree::UserRegistrationsController < Devise::RegistrationsController
75
76
  'devise.user_registrations'
76
77
  end
77
78
 
79
+ def after_sign_up_path_for(resource)
80
+ after_sign_in_redirect(resource) if is_navigational_format?
81
+ end
82
+
83
+ def after_inactive_sign_up_path_for(resource)
84
+ scope = Devise::Mapping.find_scope!(resource)
85
+ router_name = Devise.mappings[scope].router_name
86
+ context = router_name ? send(router_name) : self
87
+ context.respond_to?(:login_path) ? context.login_path : "/login"
88
+ end
89
+
78
90
  private
79
91
 
80
92
  def spree_user_params
81
93
  params.require(:spree_user).permit(Spree::PermittedAttributes.user_attributes)
82
94
  end
95
+
96
+ def after_sign_in_redirect(resource_or_scope)
97
+ stored_location_for(resource_or_scope) || account_path
98
+ end
99
+
100
+ def redirect_to_checkout_or_account_path(resource)
101
+ resource_path = after_sign_up_path_for(resource)
102
+
103
+ if resource_path == spree.checkout_state_path(:address)
104
+ respond_with resource, location: spree.checkout_state_path(:address)
105
+ else
106
+ respond_with resource, location: spree.account_path
107
+ end
108
+ end
83
109
  end
@@ -10,6 +10,8 @@ class Spree::UserSessionsController < Devise::SessionsController
10
10
  include SpreeI18n::ControllerLocaleHelper
11
11
  end
12
12
 
13
+ before_action :set_current_order
14
+
13
15
  def create
14
16
  authenticate_spree_user!
15
17
 
@@ -17,7 +19,7 @@ class Spree::UserSessionsController < Devise::SessionsController
17
19
  respond_to do |format|
18
20
  format.html {
19
21
  flash[:success] = Spree.t(:logged_in_succesfully)
20
- redirect_back_or_default(after_sign_in_path_for(spree_current_user))
22
+ redirect_back_or_default(after_sign_in_redirect(spree_current_user))
21
23
  }
22
24
  format.js {
23
25
  render json: { user: spree_current_user,
@@ -54,4 +56,24 @@ class Spree::UserSessionsController < Devise::SessionsController
54
56
  redirect_to(session["spree_user_return_to"] || default)
55
57
  session["spree_user_return_to"] = nil
56
58
  end
59
+
60
+ def after_sign_in_redirect(resource_or_scope)
61
+ stored_location_for(resource_or_scope) || account_path
62
+ end
63
+
64
+ def respond_to_on_destroy
65
+ # We actually need to hardcode this as Rails default responder doesn't
66
+ # support returning empty response on GET request
67
+ respond_to do |format|
68
+ format.all { head :no_content }
69
+ format.any(*navigational_formats) { redirect_to after_sign_out_redirect(resource_name) }
70
+ end
71
+ end
72
+
73
+ def after_sign_out_redirect(resource_or_scope)
74
+ scope = Devise::Mapping.find_scope!(resource_or_scope)
75
+ router_name = Devise.mappings[scope].router_name
76
+ context = router_name ? send(router_name) : self
77
+ context.respond_to?(:login_path) ? context.login_path : "/"
78
+ end
57
79
  end