gpt4 book ai didi

ruby-on-rails - 辅助方法中的实例变量是否在每个请求之间持续存在?

转载 作者:行者123 更新时间:2023-12-04 06:11:42 24 4
gpt4 key购买 nike

我开始开发 Ruby on Rails 应用程序,并找到了 Michael Hartl 的有用教程(Ruby on Rails Tutorial (Rails 5))。
我现在在第 8 章,我们正在从头开始开发一个简单的、简单的登录/注销功能。

在本教程中,创建了一个帮助模块来检查用户是否已经登录。这会在 header.html.erb 部分中的每个请求上调用,以确定在标题中显示哪些链接。

module SessionsHelper

#Logs in the given user
def log_in(user)
session[:user_id] = user.id
end

def current_user
@current_user ||= User.find_by(id: session[:user_id])
end

def logged_in?
!current_user.nil?
end

end

无论如何,作者描述此行用于防止每次发出请求时都必须查询数据库以获取用户记录(如果用户已登录,则仅适用于第一个请求)
@current_user ||= User.find_by(id: session[:user_id])

这对我来说很有意义,但我注意到在服务器的控制台中,在每次请求之后,仍在查询数据库以获取用户的记录,因为 @current_user 总是重置为零。
所以我的问题是,这正常吗? @current_user 变量在请求之间没有持续存在,所以我觉得有问题。谢谢 :)

最佳答案

您做得完全正确并获得了正确的结果!

author describes this line is used to prevent having to query the database for the user record each time a request is made



检查这方面的措辞。作者可能说的是数据库查询只进行一次 每个请求 不管多少次 current_user方法被调用。

您看到的模式称为 memoization并且是以下的简写形式:
  def current_user
if @current_user.nil?
@current_user = User.find_by(id: session[:user_id])
end
@current_user
end

您实际上不希望此变量在请求之间持续存在,因为这意味着如果新用户加载页面,他们将获得旧用户的 User目的。这正是你不想要的!

关于ruby-on-rails - 辅助方法中的实例变量是否在每个请求之间持续存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45180237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com