2016-01-20 160 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

你的答案很難理解 - 你可能想再次閱讀它,看看你是否想爲了清晰起見而重新使用它。 –