从 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 => :delete
调用。我确实尝试了包括method: delete
调用在内的各种排列,这些调用甚至根本不会导致注销。除非我的理解不正确,否则users/sign_out
的路由应该会触发 Devise Users::Sessions 控制器使用#destroy 方法。以上是关于从 Rails 应用程序注销时没有重定向的主要内容,如果未能解决你的问题,请参考以下文章