Ruby on Rails教程if(user_id = session [:user_id])

时间:2016-08-30 18:51:17

标签: ruby-on-rails ruby

我正在关注迈克尔·哈特尔的ruby on rails教程,如果不满意的话我也不知道如何在里面使用赋值算子:

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

有人可以解释背后的逻辑吗?

4 个答案:

答案 0 :(得分:5)

这是Ruby中的一种语法糖。

Ruby允许您在条件中分配变量并返回值

x = true #=> returns true

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

相当于

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

为您节省一条线。 如果session[:user_id]是假的,它会将假值分配给user_id并且不会执行该块。

答案 1 :(得分:4)

您可以在if语句中使用赋值运算符,因为赋值是一个表达式。赋值表达式的结果是您要分配的值。

在这种情况下,如果session[:user_id]不是nilfalse,则会调用if分支的结果,user_id将设置为session[:user_id]的结果。如果session[:user_id]nilfalse,则仍会将其分配给user_id,但if内的逻辑将无法评估。

答案 2 :(得分:1)

这相当于这样做:

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

答案 3 :(得分:0)

我相信这就是赋值运算符试图说的......这就是说如果@current_user值为null,则将其设置为等于user_id。否则,请保留@current_user值。您可以将其读作@current_user = @current_user || User.find_by(id: user_id)