Nessuna route corrisponde a “/ users / sign_out” devise rails 3

Ho installato Devise sulla mia app e applicato quanto segue nel mio file application.html.erb :

 
Signed in as . This cannot be cheese? or

Ho eseguito rake routes e confermato che tutti i percorsi sono validi.

Inoltre, nel mio file routes.rb ho devise_for :users e root :to => "home#index" .

Ottengo il seguente errore di routing quando clicco sul link “Esci”:

 No route matches "/users/sign_out" 

Qualche idea su cosa sta causando l’errore?

Penso che il percorso per uscire sia un metodo DELETE . Ciò significa che il tuo link di disconnessione deve apparire come questo:

 <%= link_to "Sign out", destroy_user_session_path, :method => :delete %> 

Il tuo non include :method => :delete parte. Inoltre, per fare in modo che funzioni, è necessario includere anche <%= javascript_include_tag :defaults %> nel file di layout ( application.html.erb ).

Ho modificato questa riga in devise.rb:

 config.sign_out_via = :delete 

a

 config.sign_out_via = :get 

e ha iniziato a funzionare per me.

Probabilmente non hai incluso il javascript file jquery_ujs. Assicurati di utilizzare l’ultima versione di jquery-ujs: https://github.com/rails/jquery-ujs e gli ultimi file disponibili:

 rails generate jquery:install 

Non dovresti avere più file rails.js. Se lo fai, probabilmente sei obsoleto. Assicurati anche che questo file sia caricato con i valori predefiniti, in config / application.rb

 config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs) 

(Di nuovo, non dovresti avere il file rails.js qui). Infine, aggiungi il link come documentato su Devise wiki (haml-style):

 = link_to('Logout', destroy_user_session_path, :method => 'delete') 

E tutto andrà bene.

La possibilità di effettuare il logout collega una chiamata DELETE RESTful richiede un attributo html data-method = "delete" utilizzando il codice rails = link_to('Logout', destroy_user_session_path, :method => :delete) .

Tuttavia, se non hai installato la gem jquery-ujs o non stai chiamando il javascript risultante nel tuo application.html tramite = javascript_include_tag "application" , la risposta verrà inviata come richiesta GET e il percorso fallirà.

Hai alcune opzioni se non vuoi usare jquery-ujs o non riesci a trovare un modo per farlo funzionare:

  1. Cambia config.sign_out_via in modo uguale :get in devise.rb (non consigliato, poiché DELETE è la query RESTful appropriata)
  2. OPPURE Modificare il link_to to = button_to('Logout', destroy_user_session_path, :method => :delete) . Con button_to Rails farà il pesante sollevamento su effettuare la chiamata DELETE corretta. Puoi quindi modellare il pulsante per apparire come un link, se lo desideri.

Prova ad aggiungere un nuovo percorso per ideare / sessioni # distruggere e colbind a questo. Per esempio:

 routes.rb devise_for :users do get 'logout' => 'devise/sessions#destroy' end 

vista:

 <%= link_to "Logout", logout_path %> 

Ho avuto lo stesso problema con rails 3.1.0, e ho risolto aggiungendo nel file le seguenti linee:

 app/assets/javascripts/application.js //= require_tree //= require jquery //= require jquery_ujs 

Usalo nel tuo file routes.rb:

 devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end 

Con una sola eccezione, la risposta di Jessie ha funzionato per me:

 <%= link_to "Sign out", destroy_user_session_path, :method => :delete %> 

modificare:

 :delete 

… a:

 'delete' 

Quindi il codice che ha funzionato per me è:

 <%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %> 

Molte risposte alla domanda già. Per me il problema era duplice:

  1. quando espongo i miei percorsi:

     devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end 
  2. Stavo avvertendo che questo è ammortizzato, quindi l’ho sostituito con:

     devise_scope :users do get '/users/sign_out' => 'devise/sessions#destroy' end 
  3. Ho pensato di rimuovere il mio jQuery. Scelta sbagliata. Devise sta utilizzando jQuery per “falsificare” la richiesta DELETE e inviarla come GET. Pertanto è necessario:

     //= require jquery //= require jquery_ujs 
  4. e naturalmente lo stesso collegamento di molti già menzionati prima:

     <%= link_to "Sign out", destroy_user_session_path, :method => :delete %> 

Inserisci:

  <%= csrf_meta_tag %> and <%= javascript_include_tag :defaults %> to layouts 

Utilizza questi link_to ai tag

  link_to 'Sign out', destroy_user_session_path, :method => :delete or link_to 'Sign out', '/users/sign_out', :method => :delete 

Nelle rotte aggiungere:

  devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end 

Un’altra opzione è configurare il logout come GET invece di DELETE, puoi farlo aggiungendo la seguente riga su /config/initializers/devise.rb

 config.sign_out_via = :get 

Ma come Steve Klabnik ha scritto sul suo blog (http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html ) prova a usare DELETE a causa della semantica di questo metodo.

Se stai usando Rails 3.1 assicurati che il tuo application.html.erb si disconnetta:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

E che la tua riga di javascript include la seguente

<%= javascript_include_tag 'application' %>

La mia ipotesi è che alcune gemme sovrascrivano la nuova struttura del percorso default.js.

Controllalo con il codice sorgente in github:

https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (data: 27 giugno 2011)

  • # Il metodo HTTP predefinito utilizzato per disconnettere una risorsa. L’impostazione predefinita è: get. 188
  • # config.sign_out_via =: get 187
  • # Il metodo HTTP predefinito utilizzato per disconnettere una risorsa. L’impostazione predefinita è: elimina. 188
  • config.sign_out_via =: cancella

Bene, ragazzi per me è stato solo rimuovere il metodo: =>: delete

 <%= link_to('Sign out', destroy_user_session_path) %> 

Ciò significa che non hai generato i file jquery dopo aver installato la gem jquery-rails. Quindi prima devi generarlo.

rails generate devise:install

Prima opzione:

Ciò significa che devi modificare la seguente riga su /config/initializers/devise.rb

config.sign_out_via =: elimina config.sign_out_via =: get

Seconda opzione:

Si modifica solo questa riga <%= link_to "Sign out", destroy_user_session_path %> in <%= link_to "Sign out", destroy_user_session_path, :method => :delete %> nel file di visualizzazione.

Solitamente :method => :delete non è scritto di default.

Voglio aggiungere a questo anche se è un po ‘vecchio.

il collegamento “sign_out” non ha funzionato, nonostante abbia: method =>: delete.

Il commento che indica che <%= javascript_include_tag :defaults %> deve essere incluso mi ha ricordato che avevo aggiunto di recente lo script java JQuery e ho usato semplici per includerli.

Quando li ho spostati da dopo il: default a prima, il sign_out ha iniziato a funzionare di nuovo.

Spero che questo aiuti qualcuno.

Non dimenticare di includere la seguente riga nel tuo application.js (Rails 3)

 //= require_self //= require jquery //= require jquery_ujs 

Includi jquery_ujs nella mia applicazione rails e funziona ora.

La maggior parte delle risposte sono parziali. Ho colpito questo problema molte volte. Due cose devono essere affrontate:

 <%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %> 

il metodo di cancellazione deve essere specificato

Quindi escogitare utilizza jquery, quindi è necessario caricarli

  <%= javascript_include_tag "myDirectiveJSfile" %> 

e assicurati che ENTRAMBI jquery e jquery-ujs siano specificati nel tuo myDirectiveJSfile.js

 //= require jquery //= require jquery_ujs 

Se stai utilizzando HTTPS con escogitare , si interromperà se il tuo link di disconnessione è per la versione non sicura. Sul back-end, reindirizza alla versione sicura. Il reindirizzamento è un GET, che causa il problema.

Assicurati che il tuo link utilizzi HTTPS. Puoi forzarlo con il protocol: "https" nel tuo url helper (assicurati di usare l’helper dell’URL e non l’helper del percorso).

 <%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %> 
  devise_for :users devise_scope :user do get '/users/sign_out' => 'devise/sessions#destroy' end 

Nel tuo route.rb:

  devise_for :users do get '/sign_out' => 'devise/sessions#destroy' get '/log_in' => 'devise/sessions#new' get '/log_out' => 'devise/sessions#destroy' get '/sign_up' => 'devise/registrations#new' get '/edit_profile' => 'devise/registrations#edit' end 

e nel tuo application.html.erb:

 <%if user_signed_in?%> 
  • <%= link_to "Sign_out", sign_out_path %>
  • <% end %>

    Questo è quello che ho fatto (con Rails 3.0 e Devise 1.4.2):

    1. Assicurati che la tua pagina carichi rails.js
    2. Usa questo parametro: ‘data-method’ => ‘delete’
    3. Buona idea per aggiungere questo parametro:: rel => ‘nofollow’

    il ':method => :delete ‘ nella pagina è ‘ data-method="delete" ‘ quindi la tua pagina deve avere jquery_ujs.js, invierà link con metodo delete not method get

    Il problema inizia con rails 3.1 … in /app/assets/javascript/ cerca solo application.js.

    Se il file non esiste crea un file con quel nome non so perché il mio file scompare o non è mai stato creato su "rails new app"...

    Quel file è l’istanza per jquery...

    Ci sono un sacco di soluzioni. ma per lo più uso questo,

     <%= link_to 'Sign out', destroy_user_session_path, method: :delete %> 

    o config devise.rb con il corretto metodo sign_out

    In devise.rb

     config.sign_out_via = :delete ( or :get which u like to use.) 

    usa :get e :delete metodo per il tuo percorso:

     devise_scope :user do match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete] end 

    Verifica se il tuo routes.rb ha una “risorsa: utenti” prima di “devise_for: users”, quindi prova a scambiarli:

    1. Lavori

      • devise_for: utenti
      • risorse: utenti
    2. Non riesce

      • risorse: utenti
      • devise_for: utenti

    In generale quando ottieni “Nessuna corrispondenza di rotta” ma pensi di avere quella rotta definita, controlla due volte il verbo http / metodo di richiesta (se ottieni, metti, pubblica, cancella ecc.) Per quella rotta .

    Se esegui percorsi rake, vedrai il metodo previsto e potrai confrontarlo con il registro delle richieste.

    So che questa è una vecchia domanda basata su Rails 3, ma mi sono appena imbattuto e risolto su Rails 4.0.4. Così ho pensato di inserire come l’ho risolto per chiunque incontri questo problema con questa versione. Il tuo chilometraggio può variare, ma ecco cosa ha funzionato per me.

    Innanzitutto assicurati di aver installato le gem e di eseguire l’installazione del pacchetto.

     gem 'jquery-rails' gem 'turbolinks' gem 'jquery-turbolinks' 

    In application.js verifica che tutto sia richiesto come di seguito.

    Attenzione se questo è successo : è //= require jquery.turbolinks e non //= require jquery-turbolinks

     //= require jquery //= require jquery_ujs //= require jquery.turbolinks //= require turbolinks //= require_tree . 

    Successivamente, aggiungi i collegamenti appropriati nell’intestazione di application.html.erb.

     <%= javascript_include_tag "application", "data-turbolinks-track" => true %> <%= javascript_include_tag :defaults %> 

    Sembra che ci siano molte varianti su come implementare il metodo delete che presumo dipende dalla versione di Rails che stai utilizzando. Questa è la syntax di delete ho usato.

     

    <%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %>

    Spero che questo aiuti a scavare qualcuno da questo buco molto frustrante!