2016-01-20 118 views
2

我想了解下面的方法究竟是如何工作的以及它在说什么,我知道它做了什么,但我想掌握它的确切工作方式。我想我理解= ||运营商,但我对如何在“如果”在等式的下半年工作并不清楚100%。红宝石Rails方法评估查询

def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
end 

的方法检查是否当前用户登录

要我理解它评估为真或假,但我不确定如何!

+1

有一个看看这篇文章[什么Ruby的|| =(双管/或等于)确实(http://www.rubyinside.com/what- ruby-double-pipe-or-equals-really-does-5488.html) –

回答

3
@current_user ||= User.find(session[:user_id]) if session[:user_id] 

相当于

if session[:user_id] 
    if [email protected]_user 
    @current_user = User.find(session[:user_id]) 
    end 
    @current_user 
end 

此表达导致

  1. 用户对象 - 当有session[:user_id]
  2. 零 - 当没有session[:user_id]
  3. 异常 - 当有session[:user_id] ,但它的确如此不对应于DB中的任何现有用户。
+0

不用'if @ @ current_user',你可能想用'if @ current_user.nil?' –

+2

不用担心,我在想如果OP在使用非布尔型变量时,对布尔型返回值会产生混淆,那么这将有助于避免这种表达式。我喜欢简化整个表达式的方式 - 除了'!'用法。 –

+1

@WandMaker:顺便提一下,你提出的代码并不是'|| ='操作符实际做的事情。 :) –

1

它的基本意思是设置@current_user,但是如果它不存在,则设置当前用户(||=部分)。接下来的部分是说,如果当前会话附有一个user_id,即if session[:user_id],则根据该user_id找到此会话的用户,并将它们存储在@current_user实例变量中。

希望帮助

贾斯汀

+1

修饰符if在条件赋值之前被评估,即如果c'等于'(a || = b)则表达式'a || = b'如果c',而不是'a || =(b if c)'。 – Stefan

+1

你的答案很难理解 - 你可能想再次阅读它,看看你是否想为了清晰起见而重新使用它。 –