javascript - 如何在不使用 Javascript 的情况下在 Rails 中制作注销按钮?
问题描述
我在不使用任何 Javascript 的情况下创建 Rails 应用程序,我想知道如何实现注销按钮以将会话设置为“nil”。大多数教程建议使用“method::delete”,但这需要使用 JavaScript。
会话控制器:
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by_username(params[:session][:name])
if user && user.authenticate(params[:session][:password])
session[:user_id] = user.id
redirect_to '/posts'
else
session[:user_id] = nil
flash[:warning] = "Failed login- try again"
redirect_to '/login'
end
end
def destroy
session[:session_id] = nil
redirect_to login_path
end
end
解决方案
您可以使用button_to
而不是link_to
.
<%= button_to logout_path, method: :destroy %>
button_to
实际上创建了一个离散<form>
元素,因此即使没有 javascript 也能正常工作。method: :destroy
添加一个隐藏的输入,由Rack::MethodOverride
.
注销用户时,您应该重置会话,而不仅仅是从会话存储中删除用户 ID。
def destroy
reset_session
redirect_to login_path
end
这会使整个会话存储 cookie 无效并防止会话固定。更好的是,首先不要重新发明身份验证轮。
推荐阅读
- python - 在 Python 中发送带有输出日志和成功状态的电子邮件
- azure - 使用多个区域 Azure 队列时如何将消息路由到正确的队列
- python - 我创建了一个函数,可以根据频率将列表中的数字分组到列表中,我需要帮助来优化它
- automata - 找到一个接受语言 L = { a^{n!} : n >= 0 } 的线性有界自动机
- authentication - 代码 401:请求具有无效的身份验证凭据。gcloud 语音转文本
- python - Visual Studio 代码卡在 Select Python Interpreter 上
- javascript - TF.js在浏览器中加载model.json格式的对象检测模型
- .htaccess - 如何在多个目录级别上进行动态 .htaccess 重定向
- cgal - CGAL Mean_curvature_flow_skeletonization contract_until_convergence 函数产生输入多边形中不存在的分支
- c++ - 未找到 gmock ElementsAreArray() 函数