Добавьте кнопку выхода из системы в RESTFUL аутентификации - PullRequest
8 голосов
/ 30 января 2010

Я установил RESTFUL аутентификацию, и все, кажется, работает нормально. Я могу зарегистрироваться и войти. Единственный способ выйти из системы - набрать URL http://localhost:3000/logout

как добавить кнопку выхода на страницу? я попытался добавить один к members.rhtml

<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>

, который ссылается на session_controller.rb но я получаю сообщение об ошибке: «На действие не ответили ни одного действия.

есть мысли? * 1009 спасибо *

Ответы [ 2 ]

8 голосов
/ 30 января 2010

Что у вас в файле маршрутов?

Попробуйте поставить

map.log_out 'logout', :controller => 'sessions', :action => 'destroy'

в ваших маршрутах.

Тогда просто есть

<%= link_to "Sign out", log_out_url %>

для ссылки выхода.

EDIT

Все зависит от того, как вы указали маршрутизацию.

Поскольку в маршрутизации у вас был map.log_out, то URL http://localhost:3000/logout url подобран этим и направляется к правильному действию.

Если у вас есть:

<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>

Это просто сгенерирует для вас ссылку http://localhost:3000/session. Но это никак не повлияет на маршрутизацию. Вам все еще нужно указать правильные маршруты.

Обратите внимание, что Rails не добавляет действие уничтожения к URL-адресу. (Он не создаст http://localhost:3000/session/destroy.) Предполагается, что если у вас есть действие уничтожения, вы будете отправлять его с глаголом DELETE http. По какой-то причине он не совсем совершенен и фактически не используется по умолчанию на отправку глагола DELETE.

Вы можете заставить его сделать это:

<%= link_to "logout", {:controller=> "user_sessions", :action=> "destroy"}, :method => :delete%>

Это все равно не будет работать, если вы также не направите его правильно. Если вы добавили следующее в маршруты:

map.resource :session

Затем rails сгенерирует маршрутизацию для всех глаголов и определит действия по умолчанию для них, включая DELETE. Дополнительную информацию можно найти здесь: Маршрутная маршрутизация с внешней стороны .

Вся эта страница стоит читать снова и снова, пока вы ее не поймете. Маршрутизация - это ключ к пониманию Rails!

Для простого контроллера, такого как Sessions, проще просто указать маршрут log_out, а затем ссылку на log_out_url ..

(Надеюсь, что это имеет смысл, лишение сна нарастает!)

1 голос
/ 15 февраля 2018

Если вы используете devise и ваша модель - Пользователь , элегантный способ здесь:

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

Работает потому что:

  • из-за HTTP-методов GET, POST, PUT, PATCH и DELETE, поэтому используется method: :delete (не method: :destroy)
  • мы используем destroy_user_session_path с devise и Пользовательской моделью, как обычно, если вы определяете другое имя модели, например Manager , вы просто меняете путь выхода до destroy_manager_session_path
...