app: fix JS redirection with Turbolinks disabled

When Turbolinks is enabled, a `redirect_to` in a `format: :js` request
will emit code that instructs Turbolinks to navigate to the page.
Turbolinks will then load the redirection target as HTML, and display
it.

But with Turbolinks disabled, the same `redirect_to` will instead
respond with a standard `302: redirect`. `Rails.ajax` will interpret
this redirect as "Please perform the same call again to the redirected
URL, in the same format" – and request our redirection target, but
using `format: :js`.


This breaks the "Publish procedure" button. In that case, we really want
the page to be navigated to. Add an explicit JS redirect, so that the
redirection occurs in HTML.
This commit is contained in:
Pierre de La Morinerie 2020-05-07 15:32:31 +00:00
parent b5f1d97629
commit 51cb3a04a3
2 changed files with 18 additions and 6 deletions

View file

@ -72,7 +72,7 @@ class Admin::ProceduresController < AdminController
@procedure.publish_or_reopen!(current_administrateur)
flash.notice = "Démarche publiée"
redirect_to admin_procedures_path
render js: "window.location='#{admin_procedures_path}'"
rescue ActiveRecord::RecordInvalid
render 'publish_validate', formats: :js
end

View file

@ -180,7 +180,11 @@ describe Admin::ProceduresController, type: :controller do
expect(procedure.publiee?).to be_truthy
expect(procedure.path).to eq(path)
expect(procedure.lien_site_web).to eq(lien_site_web)
expect(response.status).to eq 302
end
it 'redirects to the procedures page' do
expect(response.status).to eq 200
expect(response.body).to include(admin_procedures_path)
expect(flash[:notice]).to have_content 'Démarche publiée'
end
end
@ -193,13 +197,17 @@ describe Admin::ProceduresController, type: :controller do
expect(procedure.publiee?).to be_truthy
expect(procedure.path).to eq(path)
expect(procedure.lien_site_web).to eq(lien_site_web)
expect(response.status).to eq 302
expect(flash[:notice]).to have_content 'Démarche publiée'
end
it 'depubliee previous procedure' do
expect(procedure2.depubliee?).to be_truthy
end
it 'redirects to the procedures page' do
expect(response.status).to eq 200
expect(response.body).to include(admin_procedures_path)
expect(flash[:notice]).to have_content 'Démarche publiée'
end
end
context 'procedure path exists and is not owned by current administrator' do
@ -285,8 +293,12 @@ describe Admin::ProceduresController, type: :controller do
end
it { expect(procedure.publiee?).to be_truthy }
it { expect(response.status).to eq 302 }
it { expect(flash[:notice]).to have_content 'Démarche publiée' }
it 'redirects to the procedures page' do
expect(response.status).to eq 200
expect(response.body).to include(admin_procedures_path)
expect(flash[:notice]).to have_content 'Démarche publiée'
end
end
end