ruby-on-rails – Rails教程:8.4.4节中的短路评估

ruby-on-rails – Rails教程:8.4.4节中的短路评估,第1张

概述在Michael Hartl的Rails教程的第3版中,我将在第8.4.4节(“两个微妙的错误”)中加入一些代码. (链接到本节的这一部分: https://www.railstutorial.org/book/log_in_log_out#sec-two_subtle_bugs[1]) 具体来说,我对以下文本/代码感到困惑: “The second subtlety is that a user 在Michael Hartl的Rails教程的第3版中,我将在第8.4.4节(“两个微妙的错误”)中加入一些代码. (链接到本节的这一部分: https://www.railstutorial.org/book/log_in_log_out#sec-two_subtle_bugs[1])

具体来说,我对以下文本/代码感到困惑:

“The second subtlety is that a user Could be logged in (and
remembered) in multiple browsers,such as Chrome and firefox,which
causes a problem if the user logs out in one browser but not the
other. For example,suppose that the user logs out in firefox,thereby
setting the remember digest to nil (via user.forget in Listing 8.38).
This would still work in firefox,because the log_out method in
Listing 8.39 deletes the user’s ID,so the user variable would be nil
in the current_user method:

def current_user  if (user_ID = session[:user_ID])    @current_user ||= User.find_by(ID: user_ID)  elsif (user_ID = cookies.signed[:user_ID])    user = User.find_by(ID: user_ID)    if user && user.authenticated?(cookies[:remember_token])      log_in user      @current_user = user    end  endend

As a result,the Expression

user && user.authenticated?(cookies[:remember_token])

returns false due to short-circuit evaluation.”

对于这个问题,让我们坚持使用firefox而不用担心第二个浏览器错误.哈特尔似乎在说以下内容:

> log_out方法将记忆摘要设置为数据库中的nil.
> log_out方法删除存储在会话中的user_ID
和饼干.
>从同一浏览器中对current_user方法的后续调用不会引发错误,因为“current_user方法中的用户变量将为nil”.这将导致表达用户&& amp;的短路. user.authenticated(饼干[:remember_token])?

我的问题是如何发生这种情况.如果log_out方法按照规定工作,那么在后续调用中,elsif(user_ID = cookies.signed [:user_ID])行不应该为false吗? elsif块不会运行,用户变量永远不会被设置.实际上,current_user方法中的两个条件都是false,并且该方法将返回nil.根据用户变量不会出现短路.

他描述的短路评估可以进行吗?

解决方法 你是对的,因为没有发生短路

elsif (user_ID = cookies.signed[:user_ID])

不运行,用户变量永远不会设置为IN firefox.,因为cookie在Sessions Helper中被删除:

# Forgets a persistent session.  def forget(user)    user.forget    cookies.delete(:user_ID)    cookies.delete(:remember_token)  end  # Logs out the current user.  def log_out    forget(current_user)    session.delete(:user_ID)    @current_user = nil  end

但是,这并没有改变Hartl的主要观点,即用户也通过Chrome登录,这是发生错误的地方.

总结

以上是内存溢出为你收集整理的ruby-on-rails – Rails教程:8.4.4节中的短路评估全部内容,希望文章能够帮你解决ruby-on-rails – Rails教程:8.4.4节中的短路评估所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1269885.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存