Adicione um botão de logout em autenticação RESTful
-
24-09-2019 - |
Pergunta
Eu instalei a autenticação RESTful e tudo parece estar funcionando bem. Eu posso me inscrever e fazer login. A única maneira de fazer o logout é digitando no URL http: // localhost: 3000/logout
Como adiciono um botão de logout em uma página? Eu tentei adicionar um aos membros.rhtml
<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>
que faz referência ao session_controller.rb, mas recebo um erro "Nenhuma ação respondeu para mostrar. Ações: Criar, destruir e novo"
Alguma ideia? obrigado
Solução
O que você tem em seu arquivo de rotas?
Tente colocar
map.log_out 'logout', :controller => 'sessions', :action => 'destroy'
em suas rotas.
Então só tenho
<%= link_to "Sign out", log_out_url %>
Para o link de sinal.
EDITAR
Tudo se resume a como você especifica o roteamento.
Porque você tinha o mapa.log_out no roteamento, então o URL http: // localhost: 3000/logout O URL é captado por isso e roteado para a ação correta.
Se você tem :
<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>
Isso apenas gerará um link para você de http: // localhost: 3000/sessão. Mas, não faz nada para o roteamento. Você ainda precisa especificar as rotas corretas.
Observe que os Rails não anexam a ação destruída ao URL. (Não vai criar http: // localhost: 3000/sessão/destruição.) Ele pressupõe que, se você tiver uma ação de destruir, você o enviará com um verbo http de exclusão. Por alguma razão, não é muito perfeito e também não é o padrão de enviar o verbo excluir.
Você pode forçar isso a fazer isso:
<%= link_to "logout", {:controller=> "user_sessions", :action=> "destroy"}, :method => :delete%>
Isso ainda não funcionará, a menos que você também o atire corretamente. Se você colocar o seguinte nas rotas:
map.resource :session
Em seguida, os Rails geram o roteamento para todos os verbos e especificarão as ações padrão para eles, incluindo excluir. Mais informações podem ser encontradas aqui : Trilhos roteando de fora em.
Vale a pena ler toda essa página até que você realmente entenda. O roteamento é essencial para entender os trilhos!
Para um controlador simples, como sessões, é mais fácil apenas especificar a rota log_out e depois vincular a log_out_url ..
(Espero que faça sentido, a privação do sono está entrando!)
Outras dicas
Se você está usando inventar E seu modelo preocupado é Do utilizador, a maneira elegante está aqui:
<%= link_to 'logout', destroy_user_session_path, method: :delete %>
Funciona porque:
- Devido aos métodos HTTP, Get, Post, Put, Patch e Delete, portanto, usando
method: :delete
(nãomethod: :destroy
) - Estamos usando
destroy_user_session_path
com inventar e Do utilizador modelo como de costume, se você definir outro nome do modelo, como Gerente você apenas muda o caminho de logout paradestroy_manager_session_path