Ruby on rails - 设计销毁会话不会破坏会话?



设计起来真的很新颖——老实说,这很令人沮丧。。。

我的用户会话没有被破坏。

这是我导航栏中的链接:

<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,它是用户#index

所以我在users#show上得到了所有这些零类错误,因为它试图呈现默认的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>

它的评估结果是真的,我得到了这三个列表项。

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

怎么了?

您发出的是GET请求,而不是DELETE(甚至是带有设置_method参数以模拟正确DELETE的POST)。因此,您的请求将路由到UsersController#show,后者将侦听GET /users/:id

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

因此,您应该确保所有用户(包括您)都启用了Javascript,或者使用类似button_to的东西,这将在没有Javascript的情况下创建一个正确的HTML表单。

这就是我如何实现这一众所周知的工作方式:

  devise_scope :user do
    match "sign_out", :to => "sessions#destroy", via: [:delete]
  end
<%= link_to sign_out_path, :method => "DELETE" do %>
<% end%>

相关内容

  • 没有找到相关文章