2017-05-25 1 views
0

Ich überprüfe meine Website, wenn JS deaktiviert ist. Und habe einen lustigen Fehler.Ich kann mich nicht vom Gerät abmelden, wenn JavaScript deaktiviert ist

Es passiert auf der Zielseite, wenn ein Client angemeldet ist und versucht, sich abzumelden. (Client ist ein Modell Devise)

Mein navbar hat diese Abmeldelink:

<li><%= link_to 'exit', destroy_client_session_path, method: :delete %></li> 

Alles geht gut, wenn JS aktiviert ist, aber wenn JS deaktiviert ist bekomme ich diesen Fehler:

ActiveRecord::RecordNotFound in ClientsController#show 
Couldn't find Client with 'id'=sign_out 

Diese passiert auf der clients_controller.rb (Ich habe eine clients Ordner mit allen Controller dort drin: confirmations_controller.rb, omniauth_callbacks_controller.rb, ... aber ich habe auch eine clients_controller.rb Datei mit dem klassischen REST: show, ...)

Der Fehler tritt in diesem Controller in der Show Aktion:

def show 
    if client_signed_in? && current_client.id == Client.find(params[:id]).id then 
     @client = Client.find(params[:id]) 
    else 
     redirect_to root_path 
    end 
    end 

ich hier überprüft, ob die aktuellen angemeldeten in client den Client passend, die in der Navigationsleiste übergeben wird, die so nur-angemeldet Client kann ihre sehr Profil ...

sehen Obwohl kann der Regler die es nicht durchführen überprüfen ..

Meine Frage scheint: Warum das Abmelde mich an den Client-Controller sendet und warum enab Ling oder Deaktivierung JS hat eine Rolle hier?

Antwort

1

Es ist, weil Devise das HTTP-Verb delete standardmäßig verwendet und dieser Trick ist abhängig von jquery-ujs zu arbeiten.

= link_to .... method: :delete 

Nach dem jquery-ujsdocs dies unter anderem tut ...

make non-GET requests from hyperlinks;

Sie können, dass Ihre ändern in config/initializers/devise.rb

# change :delete to :get 
config.sign_out_via = :get 

und dann sollte Ihr link_to sein

= link_to 'exit', destroy_client_session_path 
+0

Verdammt. klappt wunderbar!! Vielen Dank. Obwohl können Sie bestätigen, dass dies der Devise-Code ist, der JS auslöst, wenn die Delete-Methode aufgerufen wird ... Ursache Ich denke, dass delete nur eine http-Abfrage ist, die unabhängig von JS ist – Maxence

+0

Ich aktualisierte die Antwort, sie kommt von 'jquery-ujs' – Iceman

Verwandte Themen