There is no perfect backwards compatible solution out there afaik, but this is getting me pretty close to where I want it to be.
- instead of redirecting set a empty 278 response (made up status code) for xhr requests
- tell jquery to redirect when receiving a 278 response
- the success handlers are still executed / there is no way to stop them, but they can either just insert the blank reply or do a
!= ''check
// application.js
// when we get a fake redirect response, go there
// this will still execute success handlers, but hopefully the fail or are not ugly ...
$.ajaxSetup({
statusCode: {
278: function(_,_,response){
// using turbolinks to not lose back functionality
Turbolinks.visit(response.getResponseHeader('X-278-redirect'));
}
}
})
# some controller
redirect_to_with_xhr signup_path
# application_controller.rb
# ajax requests follow all redirects, so we have to improvise with a
# special code and header to not get placeholders replaced with full pages.
def redirect_to_with_xhr(path)
if request.xhr?
response.headers["X-278-redirect"] = path
head 278
else
redirect_to path
end
end