module Turbolinks::XHRHeaders
Intercepts calls to _compute_redirect_to_location
(used by redirect_to) for two purposes.
-
Corrects the behavior of redirect_to with the :back option by using the X-XHR-Referer
request header instead of the standard Referer request header.
-
Stores the return value (the redirect target url) to persist through to the redirect
request, where it will be used to set the X-XHR-Redirected-To response header. The Turbolinks
script will detect the header and use replaceState to reflect the redirected url.
Public Instance Methods
_compute_redirect_to_location(*args)
click to toggle source
Calls superclass method
# File lib/turbolinks/xhr_headers.rb, line 14 def _compute_redirect_to_location(*args) options, request = _normalize_redirect_params(args) store_for_turbolinks begin if options == :back && request.headers["X-XHR-Referer"] super(*[(request if args.length == 2), request.headers["X-XHR-Referer"]].compact) else super(*args) end end end
Private Instance Methods
_normalize_redirect_params(args)
click to toggle source
Ensure backwards compatibility Rails < 4.2: _compute_redirect_to_location
(options) Rails >= 4.2: _compute_redirect_to_location
(request, options)
# File lib/turbolinks/xhr_headers.rb, line 41 def _normalize_redirect_params(args) options, req = args.reverse [options, req || request] end
set_xhr_redirected_to()
click to toggle source
# File lib/turbolinks/xhr_headers.rb, line 32 def set_xhr_redirected_to if session && session[:_turbolinks_redirect_to] response.headers['X-XHR-Redirected-To'] = session.delete :_turbolinks_redirect_to end end
store_for_turbolinks(url)
click to toggle source
# File lib/turbolinks/xhr_headers.rb, line 27 def store_for_turbolinks(url) session[:_turbolinks_redirect_to] = url if session && request.headers["X-XHR-Referer"] url end