首页 > 解决方案 > 验证用户是否登录的方法不适用于 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 的回溯,我不相信我的已登录?方法工作正常。我想知道是否有人对下一步要采取的步骤有任何建议,或者看到我没有看到的东西。如果需要,我可以包含任何其他代码或架构。谢谢。

标签: rubyactiverecordsinatrasinatra-activerecord

解决方案


使用find_by(id: session[:user_id])而不是find(session[:user_id]).

find如果传递了 nil id 或找不到匹配的记录,则会引发错误。find_by在这两种情况下都不会引发错误。

由于您的代码允许此查询的结果为 nil(@current_user变量将为 nil,current_user方法的返回值也是如此),看来这一更改将解决您的问题。


推荐阅读