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

Foi útil?

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ão method: :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 para destroy_manager_session_path
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top