如何设计销毁会话并从控制器退出?

时间:2014-09-15 23:47:11

标签: ruby-on-rails ruby ruby-on-rails-4 devise

设计销毁会话并从控制器注销?

if something_is_not_kosher
  # 1. log this event, 2. send notice
  redirect_to destroy_user_session_path and return
end

也尝试过:

if something_is_not_kosher
 # 1. log this event, 2. send notice
  redirect_to controller: 'devise/sessions', action: 'destroy', method: :delete and return
end

错误是No route matches [GET] "/users/sign_out"但我明确设置方法::在示例2中删除。也许设计有一个方法? current_user.sign_out并尝试过sign_out(current_user)哪个也行不通?谢谢你的帮助。

rake routes:

        new_user_session GET    /users/sign_in(.:format)         devise/sessions#new
            user_session POST   /users/sign_in(.:format)         devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)        devise/sessions#destroy
           user_password POST   /users/password(.:format)        devise/passwords#create
       new_user_password GET    /users/password/new(.:format)    devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)   devise/passwords#edit
                         PATCH  /users/password(.:format)        devise/passwords#update
                         PUT    /users/password(.:format)        devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)          users/registrations#cancel
       user_registration POST   /users(.:format)                 users/registrations#create
   new_user_registration GET    /users/sign_up(.:format)         users/registrations#new
  edit_user_registration GET    /users/edit(.:format)            users/registrations#edit
                         PATCH  /users(.:format)                 users/registrations#update
                         PUT    /users(.:format)                 users/registrations#update
                         DELETE /users(.:format)                 users/registrations#destroy

4 个答案:

答案 0 :(得分:12)

为什么不使用devise的内置sign_out_and_redirect(current_user)方法?

答案 1 :(得分:7)

所以我最终通过创建自定义注销路径解决了这个问题

  devise_scope :user do
    get '/signout', to: 'devise/sessions#destroy', as: :signout
  end

在我的控制器里我有:

if something_is_not_kosher
  redirect_to signout_path and return
end

答案 2 :(得分:6)

destroy_user_session_path(@user)是用户的退出路径,但必须使用DELETE方法。 redirect_to方法会告诉broswer请求其他路径,但broswer可以使用GET方法请求。
因此,如果您想让用户退出,您必须使用DELETE方法或使用AJAX请求设置退出表单,以便用户退出但不能使用redirect_to功能。

如果您只想销毁用户会话,请使用sign_out @user即可。

答案 3 :(得分:2)

以防万一有人无法直接使用它。

        <% if user_signed_in? %>
        <li><%= link_to "Logout", destroy_user_session_path, :method => :delete %></li>
        <% else %>
        <li><%= link_to "Sign up now!",  new_user_registration_path%></li>
        <% end %>