2016-08-30 83 views

回答

5

这是Ruby的语法糖之一。

红宝石让你在条件语句分配变量,并返回到

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

x = true #=> returns true

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

相当于为您节省了线。 如果session[:user_id]是虚假的,它会将假值赋给user_id并且不执行该块。

+0

这不完全相同。在第一个例子中,user_id的作用域就是if的主体。在后者中,user_id是在if之后定义的。 – Ursus

+0

@Ursus:错误。试试irb。 '如果'不是Ruby中的范围门。无论何时定义类,模块或方法,都会创建一个新的作用域。在这里阅读Scope Gate部分的更多内容 - http://hopsoft.github.io/blog/ruby-metaprogramming-idioms/ – kiddorails

+0

在回答之前,我在irb中尝试过。嗯。 – Ursus

4

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

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

0

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

1

这相当于这样做:

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