2013-08-22 51 views
1

我對Rails應用程序在我的Ruby的一個輔助模塊,和輔助(ApplicationHelper有一個名爲is_same_user?的方法,它是像這樣定義:Ruby on Rails的助手緩存評估值

def is_same_user?(user) 
     !user.nil? && user_signed_in? && current_user.username == user.is_a?(User) ? user.username : user 
end 

當我使用這個它似乎偶爾會發生變化,偶爾它會返回true並且只是true,偶爾它會正常工作,偶爾它會返回false並且只是false。我知道這不是失敗的邏輯,因爲我已經將邏輯代替了方法調用,它的功能完全正常,我知道沒有另外一種方法被定義爲is_same_user?,它可以被調用。

它讓我懷疑它是否是某種類型的Ruby on Rails助手緩存?這是我可以得出的唯一可能的結論。我很難追查這可能是什麼,任何幫助將不勝感激。

+0

你有沒有爲這個幫助器方法編寫任何測試或規範? –

+0

不,我沒有,但是我已經在一系列不同的條件下手動測試了它。 –

回答

2

我認爲邏輯這裏失敗了一點。 我假設你想檢查用戶是不是零,用戶登錄和current_user.username是eqal用戶或user.username(基於給定的參數)。比缺少括號有問題。

> :a == true ? :a : :b 
=> :b 
> :a == :a ? :a : :b 
=> :a 
> :a == (true ? :a : :b) 
=> true 

所以,你必須用括號來包裝你user.is_a?(User) ? user.username : user

!user.nil? && user_signed_in? && current_user.username == (user.is_a?(User) ? user.username : user) 
2

我不認爲這裏有任何魔法,有一個錯誤,你只需要找到它。

它看起來應該檢查給定的「用戶」可能是字符串名稱或用戶對象是否與current_user(Devise helper?)用戶名相同?

賠率是你假設應該在任何時候都存在的東西,是不是有...

很難調試像一個大的語句。當你需要弄明白的時候,把它分開!下面是一個(未經測試)絕對可怕爲了洞察方式:

def is_same_user?(user) 
    if user.nil? 
    # possible breakpoint 
    logger.debug("user is nil") 
    return false 
    end 

    unless user_signed_in? 
    # possible breakpoint 
    logger.debug("no user signed in") 
    return false 
    end 

    logger.debug("#{user.class} given: #{user}") 
    if user.is_a?(User) 
    # possible breakpoint 
    return current_user.username == user.username 
    else 
    # possible breakpoint 
    return current_user.username == user 
    end 
end 
0

正如@邁克爾杜達指出,這是一個的引起你的錯誤運算符優先級,但錯誤是把太多的副作用一行代碼很多。

這可以通過使用guard clauses得到改善(和作出正確的):

def is_same_user?(username) 
    return false unless username 
    return false unless user_signed_in? 
    username = username.username if username.respond_to?(:username) 
    current_user.username == username 
end 

此外,代替測試是否用戶名用戶,我們測試它江湖醫生像用戶。