Don't redirect to POST request URLs after sign out

Sometimes we define URLs for POST requests which are not defined for GET
requests, such as "/residence", so redirecting to it after signing out
results in a routing error.

So instead of using the request referer, we're using the stored location
devise uses, and we're not storing locations in POST requests.
This commit is contained in:
Javi Martín
2020-08-11 18:19:48 +02:00
parent 2fa8792a35
commit 83e4633643
3 changed files with 22 additions and 2 deletions

View File

@@ -107,7 +107,7 @@ class ApplicationController < ActionController::Base
end end
def set_return_url def set_return_url
if !devise_controller? && is_navigational_format? if request.get? && !devise_controller? && is_navigational_format?
store_location_for(:user, request.fullpath) store_location_for(:user, request.fullpath)
end end
end end

View File

@@ -1,4 +1,9 @@
class Users::SessionsController < Devise::SessionsController class Users::SessionsController < Devise::SessionsController
def destroy
@stored_location = stored_location_for(:user)
super
end
private private
def after_sign_in_path_for(resource) def after_sign_in_path_for(resource)
@@ -10,7 +15,7 @@ class Users::SessionsController < Devise::SessionsController
end end
def after_sign_out_path_for(resource) def after_sign_out_path_for(resource)
request.referer.present? && !request.referer.match("management") ? request.referer : super @stored_location.present? && !@stored_location.match("management") ? @stored_location : super
end end
def verifying_via_email? def verifying_via_email?

View File

@@ -45,4 +45,19 @@ describe "Sessions" do
expect(page).to have_current_path "/" expect(page).to have_current_path "/"
end end
scenario "Sign out does not redirect to POST requests URLs" do
login_as(create(:user))
visit account_path
click_link "Verify my account"
click_button "Verify residence"
expect(page).to have_content(/errors prevented the verification of your residence/)
click_link "Sign out"
expect(page).to have_content "You must sign in or register to continue."
expect(page).to have_current_path new_user_session_path
end
end end