验证用户是否登录的方法不适用于 Sinatra 应用程序。
Methods to validate whether user is logged in aren't working for Sinatra Application.
下面有两个辅助方法。
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 的回溯,我不相信我的 logged_in? 方法工作正常。我想知道是否有人对下一步要采取的步骤有任何建议或看到了我没有看到的东西。如果需要,我可以包含任何其他代码或架构。谢谢。
使用 find_by(id: session[:user_id])
而不是 find(session[:user_id])
。
find
如果传递了 nil id 或找不到匹配的记录,则会引发错误。 find_by
在这两种情况下都不会引发错误。
由于您的代码允许此查询的结果为 nil(@current_user
变量将为 nil,current_user
方法的 return 值也将为 nil)它看来这一更改将解决您的问题。
下面有两个辅助方法。
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 的回溯,我不相信我的 logged_in? 方法工作正常。我想知道是否有人对下一步要采取的步骤有任何建议或看到了我没有看到的东西。如果需要,我可以包含任何其他代码或架构。谢谢。
使用 find_by(id: session[:user_id])
而不是 find(session[:user_id])
。
find
如果传递了 nil id 或找不到匹配的记录,则会引发错误。 find_by
在这两种情况下都不会引发错误。
由于您的代码允许此查询的结果为 nil(@current_user
变量将为 nil,current_user
方法的 return 值也将为 nil)它看来这一更改将解决您的问题。