有人可以解释rails pls中的def current_user方法

时间:2015-12-13 08:11:59

标签: ruby-on-rails session

这是我不太了解的一句话。

@_current_user ||= session[:current_user_id] &&      User.find(session[:current_user_id])

如果有一个包含电子邮件字段和密码字段的用户模型User.find正在寻找什么?即用户模型中没有存储会话字段。

2 个答案:

答案 0 :(得分:0)

会话与应用程序中的控制器有关。

  

会话是一种存储要在多个页面中使用的信息(在变量中)的方法。与cookie不同,信息不会存储在用户计算机上。

会话通常保存为#!/home/sklassen/py/try-pycrontab/env/bin/python from crontab import CronTab class CronSet: def __init__(self): self._crontab = CronTab() def add_job(self, min, hour, day, month, job_number): cmd = "sh /home/pifik/Documents/record_radio.sh" job = self._crontab.new(cmd, comment='job'+str(job_number)) job.setall(min, hour, day, month, None) def save(self): self._crontab.write() def main(): c = CronSet() c.add_job(0, 22, 23, 12, 1) c.add_job(0, 23, 23, 12, 2) c.save() if __name__ == '__main__': main() # running 'crontab -l' produces the following # 0 22 23 12 * sh /home/pifik/Documents/record_radio.sh # job1 # 0 23 23 12 * sh /home/pifik/Documents/record_radio.sh # job2 对,并且它们可能会过期。

所以,根据您给出的代码示例:

key: value hash

如果@_current_user ||= session[:current_user_id] User.find(session[:current_user_id]) 为零,则行@_current_user ||= session[:current_user_id]@_current_user设置为会话中current_user_id的值。

另一方面,

@_current_user在会话中获得User.find(session[:current_user_id])的值,该值应为current_user_id,并且将转到数据库以查找具有该ID的用户。< / p>

因此,idUser.find(session[:current_user_id])找到的,而不是idemail

答案 1 :(得分:0)

@current_user用作实例变量,以便为当前登录的用户带回User对象。

@current_user(至少对Devise用户这样的用户)的典型用例是在我们的代码基础架构中使用它:

def create
   @model = current_user.models.new ...
end

因此,你的问题的答案:

  

User.find在寻找什么?

...是否正在寻找已登录成员的 User 对象。

我认为您对身份验证系统的工作方式感到困惑。即,一旦您登录(身份验证),应用程序就会设置会话(如Sunny K所述)以表示正在浏览的用户。

这就是您拥有User.find(session[:current_user_id])的原因 - 您的身份验证系统(无论是自制程序还是预先打包)已经已经验证了电子邮件&amp;密码。现在它必须跟踪您是哪个用户,这样每次发送请求时,它都可以重建您的current_user对象。

-

另一个重要因素是HTTP is "stateless" - 意味着每个请求必须是“新的”(IE每次都必须重新创建状态)。

这与某个有状态应用程序(例如游戏)相反,您运行该应用程序的事实允许您在整个会话期间保留其状态。 / p>

因此,当Rails收到来自浏览器的请求时,它不会“记住”你是谁 - 它实际上是一台愚蠢的机器。

如果您想要访问特定于用户的信息,则需要首先验证用户(您拥有),然后授权他们的请求。授权部分取决于您,但为了使其工作,您基本上必须每次都将当前用户ID发送到应用程序。

然后,当您调用程序的实例时,@current_user对象将可用。这是User.find(session[:current_user_id])的用途。