ruby - 验证用户是否登录的方法不适用于 Sinatra 应用程序。
问题描述
我在下面有两个辅助方法。
helpers do
def logged_in?
!current_user.nil?
end
def current_user
@current_user ||= User.find(session[:user_id])
end
我正在使用这些方法来验证用户是否已登录,或者他们是否需要登录或创建帐户。在我的索引页面上,我有两条路线可以将我带到登录页面或创建用户页面。这些路线如下所示。
HTML 视图
<html>
<head>
<title>Simple Meal Prep</title>
<link href="https://fonts.googleapis.com/css?family=Caveat"
rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/stylesheet.css" />
</head>
<body>
<h1 id="landing_page_title">Welcome to Cookbook</h1>
<h2 id="site_logline">A Simple App to keep track of your recipes</h2>
<br></br>
<a id="login_button" href="/login">Login</a> <route 1>
<br></br>
<a id="signup_button" href="/signup">Sign Up</a> <route 2>
</body>
对应的用户控制器路由
class UserController < ApplicationController
get '/user_home' do
if logged_in? then erb :"/users/user_home" else redirect '/' end
end
get '/login' do
if logged_in? then redirect to '/user_home' else erb :"/users/login"
end
end
end
我得到的错误是当我单击我的登录按钮时,我收到一个 sinatra 错误,指出“ActiveRecord::RecordNotFound at /login 找不到没有 ID 的用户”。查看来自 sinatra 的回溯,我不相信我的已登录?方法工作正常。我想知道是否有人对下一步要采取的步骤有任何建议,或者看到我没有看到的东西。如果需要,我可以包含任何其他代码或架构。谢谢。
解决方案
使用find_by(id: session[:user_id])
而不是find(session[:user_id])
.
find
如果传递了 nil id 或找不到匹配的记录,则会引发错误。find_by
在这两种情况下都不会引发错误。
由于您的代码允许此查询的结果为 nil(@current_user
变量将为 nil,current_user
方法的返回值也是如此),看来这一更改将解决您的问题。
推荐阅读
- python - 使用 anaconda 提示创建新的 scrapy 项目时出错
- html - 水平导航背景颜色中途停止
- python - 使用具有大量类别的附加列在条形图中绘制
- rest - REST API 设计 - 私有资源字段的最佳实践
- sql - 分组此 SQL 查询的问题
- reactjs - 使 TypeScript 函数接受 Redux 连接组件
- c# - IDisposable 对象是否在从方法返回后自行处理?
- c++ - 无法退出 do-while 循环?
- javascript - 每次点击时如何添加一定的数字?
- python - 在应用程序目录中找不到“figures.py”(Django-matplotlib 集成)