繁体   English   中英

设计破坏会话不破坏会话?

[英]Devise destroy session doesn't destroy the session?

设计真的很新 - 所有诚实都令人非常沮丧......

我的用户会话没有被销毁。

这是导航栏中的链接:

<li><%= link_to 'Logout', destroy_user_session_path, :method => :delete %></li>

devise.rb具有:delete方法配置:

# The default HTTP method used to sign out a resource. Default is :delete.
  config.sign_out_via = :delete

路线是:

  destroy_user_session DELETE /users/sign_out(.:format)             sessions#destroy

应用控制器说:

class ApplicationController < ActionController::Base
  protect_from_forgery

  private
      def after_sign_out_path_for(resource_or_scope)
        root_path
      end

我点击我的退出链接,我的控制台显示:

Started GET "/users/sign_out" for 127.0.0.1 at 2014-04-18 12:00:26 -0500
Processing by UsersController#show as HTML
  Parameters: {"id"=>"sign_out"}
MONGODB (0.8ms) waittext_development['users'].find({:_id=>BSON::ObjectId('53515685963e6507ad00003e')}).limit(-1)

它似乎没有找到一个活跃的会话(我沮丧地点击了十几次),但问题是我登陆的页面 - UsersController #show - 不是我告诉它路由到的页面。 它应该是root_path,即users #index

因此我在用户#show上获得了所有这些nil类错误,因为它试图渲染默认的rails @ user.name等,并且@user未定义 - 我最终手动覆盖show动作以简单地渲染'index'我最终在我的索引页面 - 但仍然 - 我看到current_user.email打印在这里:

<% if user_signed_in? -%>
  <ul>
    <li><%= current_user.email %></li>
    <li><%= link_to 'My info', edit_user_registration_path %></li>
    <li><%= link_to 'Sign out', destroy_user_session_path %></li>
  </ul>

它正在评估TRUE,我正在获得这三个列表项。

用户不应该登录,因为我刚刚销毁了会话!

有没有搞错?

您发出GET请求,而不是DELETE (甚至是带有set _method参数的POST来模拟正确的DELETE )。 因此,您的请求被路由到UsersController#show ,它监听GET /users/:id

原因是,纯HTML链接通常只能导致GET请求。 对于其他任何事情,你需要一个表格。 如果您现在将:method参数传递给视图中的link_to方法,Rails将生成一些Javascript,它捕获链接上的点击以生成表单并以此方式发送请求。 如果用户禁用了Javascript,这将失败,这似乎就是这种情况。

因此,您应该确保所有用户(包括您)都启用了Javascript或者使用了button_to东西,这样就可以在HTML中创建一个没有Javascript的正确表单。

这就是我如何实现这个已知的工作方式:

  devise_scope :user do
    match "sign_out", :to => "sessions#destroy", via: [:delete]
  end

<%= link_to sign_out_path, :method => "DELETE" do %>

<% end%>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM