从 Rails 应用程序注销时没有重定向

Posted

技术标签:

【中文标题】从 Rails 应用程序注销时没有重定向【英文标题】:No redirect on signout from rails app 【发布时间】:2017-06-27 15:49:51 【问题描述】:

从我的 Rails 应用程序中注销会在日志中生成 Completed 204 No Content 错误。视图会冻结,直到手动刷新。

我已将错误跟踪到处理 DELETE 请求的方式:

Started DELETE "/users/sign_out" for 127.0.0.1 at 2017-02-09 06:55:24 -0800
Processing by Devise::SessionsController#destroy as */*

第二行应该有html 而不是*/*。关于我需要更改什么配置来解决这个问题的任何提示?

更新 这是一个使用 Rails 后端和 Hyperloop 项目中的 HyperReact 模块的测试应用程序。所以视图被渲染为一个 React 组件。这是该组件的代码:

module Components
  module Users
    class Show < React::Component::Base
      param :name, type: String
      param :provider, type: String
      param :signed_in_at, type: String
      param :ip, type: String
      param :avatar, type: String

      def render
        div do
          img(src: params.avatar, width: 50, height: 50)
          h1  "Hello and welcome to your profile page #params.name!"
          h2  "You are signed in with #params.provider since #params.signed_in_at." 
          h3  "Your ip is #params.ip." 
          button.btn.btn_default(type: :button)  "Signout!" .on(:click) do
            HTTP.delete("users/sign_out")
            alert("Signing out")
          end
        end
      end
    end
  end
end

【问题讨论】:

您能发布您的退出方式吗?您正在使用的链接/按钮的代码?从外观上看,这是您的问题。 @Mark 已更新退出代码。 代码好像没问题,你定义了root_path吗?设计将其用于交互后的基本重定向,因为说“无内容”我猜它没有去哪里,如果还有另一个问题,你总是可以覆盖 after_sign_out_path 方法(或类似的东西,不确定名称,但在设计 wiki 中) 在 routes.rb 中 root 设置为 users#show 但 users_controller 在顶部有一个 before_action :authenticate_user!。如果没有经过身份验证,它应该使用 Devise users::sessions 控制器,对吧? 【参考方案1】:

对不起,在你的情况下,我的回答没有意义。对于设计,通常还需要定义 :method=>"delete"。我看到你这样做了,但我不确定链接是否正确。 Rails 中通常的退出链接看起来像

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

如果您使用 .destroy 而不是 delete 会发生什么?因为该操作称为“销毁”,而 http 方法删除。但是,我很抱歉,我不熟悉您所显示的语法。

【讨论】:

我的 javascript 知识几乎为零,所以请耐心等待。我会把remote: true 放在HTTP.delete 电话上方吗?设计#destroy 方法是:DELETE /resource/sign_out def destroy super end 格式问题抱歉。 我的理解是 HTTP.delete 相当于 erb 文件中的 :method =&gt; :delete 调用。我确实尝试了包括method: delete 调用在内的各种排列,这些调用甚至根本不会导致注销。除非我的理解不正确,否则users/sign_out 的路由应该会触发 Devise Users::Sessions 控制器使用#destroy 方法。

以上是关于从 Rails 应用程序注销时没有重定向的主要内容,如果未能解决你的问题,请参考以下文章

从 YML 文件设置 rails 重定向

使用 Spring Security 和 Grails 注销后如何将用户重定向到不同的页面

注销和删除 Cookies [重定向到主页]

设计:注销*没有*重定向?

IdentityServer3 注销端点上没有自动重定向

当在rails中按下浏览器的后退按钮时,在注销后进入登录页面