Instalei o dispositivo no meu aplicativo e apliquei o seguinte no meu application.html.erb
arquivo:
<div id="user_nav">
<% if user_signed_in? %>
Signed in as <%= current_user.email %>. This cannot be cheese?
<%= link_to 'Sign out', destroy_user_session_path %>
<% else %>
<%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %>
<% end %>
</div>
Corri rake routes
e confirmei que todas as rotas são válidas.
Além disso, no meu routes.rb
arquivo eu tenho devise_for :users
e root :to => "home#index"
.
Recebo o seguinte erro de roteamento ao clicar no link "Sair":
No route matches "/users/sign_out"
Alguma idéia do que está causando o erro?
gem 'devise', :git => 'git://github.com/plataformatec/devise.git'
. Isso não fez nada.Respostas:
Eu acho que o caminho para sair é um
DELETE
método. Isso significa que seu link de saída precisa ter a seguinte aparência:O seu não inclui a
:method => :delete
parte. Além disso, observe que, para que isso funcione, você também deve incluir<%= javascript_include_tag :defaults %>
no seu arquivo de layout (application.html.erb
).fonte
link_to "Sign out", destroy_user_session_path
sempre foi bom o suficiente para mim.$("<a href='/users/sign_out' data-method='delete'>Sign out</a>").appendTo('body');
- se o jQuery estiver carregado na página.Eu mudei esta linha no devise.rb:
para
e começou a trabalhar para mim.
fonte
config.sign_out_via = [ :post, :delete ]
oudevise_for :users, :sign_out_via => [ :post, :delete ]
, conforme descrito em devise / rails / routes.rb .Você provavelmente não incluiu o arquivo jquery_ujs javascript. Verifique se você está usando a versão mais recente do jquery-ujs: https://github.com/rails/jquery-ujs e os últimos arquivos disponíveis:
Você não deve ter mais nenhum arquivo rails.js. Se você o fizer, provavelmente está desatualizado. Verifique também se este arquivo está carregado com padrões, em config / application.rb
(Novamente, você não deve ter o arquivo rails.js aqui). Por fim, adicione o link conforme documentado no wiki do Devise (estilo haml):
E tudo ficará bem.
fonte
javascript_include_tag "jquery_ujs"
application.js
. Má suposição, suponho. Obrigado.A capacidade de fazer do Logout vincular uma chamada DELETE RESTful requer um atributo html
data-method = "delete"
usando o código rails= link_to('Logout', destroy_user_session_path, :method => :delete)
.No entanto, se você não possui a gema
jquery-ujs
instalada ou não está chamando o javascript resultante em seu application.html via= javascript_include_tag "application"
, a resposta será enviada como uma solicitação GET e a rota falhará.Você tem algumas opções se não deseja usar
jquery-ujs
ou não consegue encontrar uma maneira de fazê-lo funcionar:config.sign_out_via
para igual:get
dentrodevise.rb
(não recomendado, pois DELETE é a consulta RESTful apropriada)link_to
para= button_to('Logout', destroy_user_session_path, :method => :delete)
. Obutton_to
Rails fará o trabalho pesado ao fazer a chamada DELETE adequada. Você pode estilizar o botão para parecer um link, se desejar.fonte
button_to
, o Rails gera umform
para toda a ação. É por isso que é possível usar o:delete
método combutton_to
e não comlink_to
, basta ver o HTML gerado.Tente adicionar uma nova rota para criar / sessões # destruir e vincular a ela. Por exemplo:
Visão:
fonte
link_to
chamada, conforme descrito na outra resposta.Use-o no seu arquivo routes.rb:
fonte
Eu tive o mesmo problema com o rails 3.1.0 e resolvi adicionar no arquivo as seguintes linhas:
fonte
Com uma exceção, a resposta de Jessie funcionou para mim:
mudança:
... para:
Portanto, o código que funcionou para mim é:
fonte
Muitas respostas para a pergunta já. Para mim, o problema era duplo:
quando eu expandir minhas rotas:
Eu estava recebendo um aviso de que isso é depreciado, então substituí-o por:
Eu pensei em remover meu jQuery. Má escolha. O Devise está usando o jQuery para "falsificar" a solicitação DELETE e enviá-la como GET. Portanto, você precisa:
e, claro, o mesmo link que muitos mencionados anteriormente:
fonte
Adicionar:
Use essas tags link_to
Em rotas, adicione:
fonte
Outra opção é configurar o logout para ser um GET em vez de um DELETE, você pode fazer isso adicionando a seguinte linha em
/config/initializers/devise.rb
Mas, como Steve Klabnik escreveu em seu blog (http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html) ) tente usar DELETE devido à semântica deste método.
fonte
Se você estiver usando o Rails 3.1, verifique se o logout application.html.erb se parece com:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
E que sua linha de inclusão javascript se parece com a seguinte
<%= javascript_include_tag 'application' %>
Meu palpite é que algumas gemas substituem a nova estrutura do local default.js.
fonte
Confira com o código fonte no github:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (data: 27 de junho de 2011)
fonte
Bem, pessoal para mim foi apenas remover o: method =>: delete
fonte
Isso significa que você não gerou os arquivos jquery depois de instalar o gem jquery-rails. Então, primeiro você precisa gerá-lo.
rails generate devise:install
Primeira opção:
Isso significa que você deve alterar a seguinte linha em
/config/initializers/devise.rb
config.sign_out_via =: apague para config.sign_out_via =: obtenha
Segunda opçao:
Você altera apenas esta linha
<%= link_to "Sign out", destroy_user_session_path %>
para<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
no arquivo de exibição.Normalmente
:method => :delete
não é gravado por padrão.fonte
Quero acrescentar isso, mesmo que seja um pouco antigo.
o link "sign_out" não funcionou, apesar de ter: method =>: delete.
O comentário indicando que
<%= javascript_include_tag :defaults %>
deve ser incluído me lembrou que eu adicionei recentemente o script java JQuery e usei<script src=""/>
tags simples para incluí-las.Quando os mudei de após os padrões: para antes, o sign_out começou a funcionar novamente.
Espero que isso ajude alguém.
fonte
A maioria das respostas é parcial. Eu bati esse problema muitas vezes. Duas coisas precisam ser abordadas:
o método de exclusão precisa ser especificado
Em seguida, o devise usa jquery, então você precisa carregar aqueles
e verifique se AMBOS jquery e jquery-ujs estão especificados em myDirectiveJSfile.js
fonte
Não esqueça de incluir a seguinte linha no seu application.js (Rails 3)
Incluir
jquery_ujs
no meu aplicativo de trilhos e ele funciona agora.fonte
Se você estiver usando HTTPS com dispositivo , ele será interrompido se o link de logout for para a versão não segura. No back-end, ele redireciona para a versão segura. Esse redirecionamento é um GET, que causa o problema.
Verifique se o seu link usa HTTPS. Você pode forçá-lo
protocol: "https"
no seu auxiliar de url (certifique-se de usar o auxiliar de url e não o auxiliar de caminho).fonte
fonte
O problema começa com o rails 3.1 ...
/app/assets/javascript/
basta procurar pelo application.js.Se o arquivo não existir, crie um arquivo com esse nome, não sei por que meu arquivo desapareceu ou nunca foi criado
"rails new app"...
.Esse arquivo é a instância para
jquery...
.fonte
Muitas soluções estão lá. mas principalmente usa isso,
ou config devise.rb com o método sign_out apropriado
Em devise.rb
fonte
use
:get
e:delete
método para o seu caminho:fonte
Em suas rotas.rb:
e no seu application.html.erb:
fonte
Foi o que fiz (com o Rails 3.0 e o Devise 1.4.2):
fonte
Veja se o seu routes.rb possui um "resource: users" antes de um "devise_for: users" e tente trocá-los:
Trabalho
Falha
fonte
o
':method => :delete
'na página é'data-method="delete"
', portanto, sua página deve ter jquery_ujs.js, ela enviará o link com o método delete e não o método getfonte
Eu sei que essa é uma pergunta antiga baseada no Rails 3, mas acabei encontrando e resolvendo-o no Rails 4.0.4. Então, pensei em explicar como o corrigi para qualquer pessoa que encontre esse problema com esta versão. Sua milhagem pode variar, mas eis o que funcionou para mim.
Primeiro, verifique se você tem as gemas instaladas e execute a instalação do pacote.
No application.js, verifique se tudo é necessário, como abaixo.
Cuidado se isso pegar : é
//= require jquery.turbolinks
e não//= require jquery-turbolinks
Em seguida, adicione os links apropriados no cabeçalho de application.html.erb.
Parece haver muitas variações de como implementar o método delete, que eu assumo depende da versão do Rails que você está usando. Essa é a
delete
sintaxe que eu usei.Espero que ajude a tirar alguém desse buraco muito frustrante!
fonte
Em geral, quando você obtém "Nenhuma rota correspondente", mas acha que tem essa rota definida, verifique o método http verb / request (seja obtendo, colocando, postando, excluindo etc.) dessa rota .
Se você executar rotas rake, verá o método esperado e poderá compará-lo com o log de solicitações.
fonte