ruby-on-rails - 在 React on Rails 应用程序中呈现无效凭据消息
问题描述
关于身份验证的初学者问题,请耐心等待:
在我的 React on Rails 应用程序中,所有身份验证方法都可以正常工作,但如果用户输入无效凭据,控制台会显示 500 uncaught in promise 错误。我希望能够在屏幕上显示“无效凭据”方法,但是从概念上讲,我不知道从哪里开始。
在 Ruby 控制器中,我指出登录方法应该返回未经授权的:
def login
@user = User.find_by(username: login_params[:username])
if @user.authenticate(login_params[:password])
token = encode({id: @user.id})
render json: {
user: @user.attributes.except("password_digest"),
token: token
}, status: :ok
else
render json: { errors: 'unauthorized' }, status: :unauthorized
end
end
但是在控制台中我只看到一个 500 错误。
任何关于我应该从哪里开始的指导将不胜感激。我只是不知道这是我需要在前端还是后端更改的东西。也许我需要在某个地方尝试捕捉?我只是有点迷路了。
解决方案
如果有人输入了有效的用户名但密码无效,您的代码似乎可以工作,但500
如果有人输入了无效的用户名,您会收到错误消息。
原因是如果不存在匹配记录则#find_by
返回。nil
所以在这一行之后:
@user = User.find_by(username: login_params[:username])
@user
nil
如果不存在这样的用户名,将是。但是在下一行中,您调用@user.authenticate
- 并且由于nil
没有这样的方法,您会得到您所看到的崩溃。
修复很简单——我们可以使用 Ruby 的“安全导航”运算符&.
仅authenticate
在@user
不为 nil 时调用:
if @user&.authenticate(login_params[:password])
如果@user
为 nil,则不会调用身份验证方法,代码将跳转到该else
块。
推荐阅读
- c# - 无法使用 LINQ-SQL 控制台应用程序插入数据库
- node.js - Express-gateway 为快速微服务应用程序创建新的插件/策略
- java - 使用 Java api 调用 Kubernetes Spark Operator
- postgresql - 我可以将数据从 CloudSQL 实时加载到 BigQuery 吗?
- css - 调整窗口大小时不响应,但在不同设备上使用 Google Inspector 工具
- mongodb - Mongo中的字符串时间戳性能
- python - pyspark 聚合,同时找到组的第一个值
- azure-devops - Azure 板,当用户故事导出使用 html 标记创建的 CSV 文件时
- deep-learning - 无法从“smart_open”导入名称“open”
- android - Android 工具提示显示在菜单项上