2017-07-19 28 views
2

我正在开发Ruby on Rails应用程序,并发现了Michael Hartl的一篇有用的教程(Ruby on Rails教程(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变量不是在请求之间持续存在,所以我觉得有些事情是错误的。谢谢:)

+0

伟大的问题。特别是检查控制台以查看报告的内容。这样可以防止使用导轨时出现大量未来的痛苦和调试问题! :) –

回答

2

你这样做是完全正确的,并得到正确的结果!

笔者介绍这条线是用来防止发生请求时

检查这一措辞每次查询数据库的用户记录。作者可能会说的是,无论调用current_user方法多少次,数据库查询都只需要每个请求

你看到被称为memoization,是下面的简写形式的模式:

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

你其实不想这个变量的请求之间持续下去,因为这意味着,如果一个新的用户加载的页面,他们会得到旧用户的User对象。这正是你不想要的!

+0

真棒:)感谢您的快速答案。你的第二点也是我想知道的。我正在阅读教程中的内容,所以我应该寻求帮助 –

相关问题