2016-02-05 94 views
0

早上好人。在我的模型中,我創建了一個顯示行的方法。 該頁面無法正常工作,導致next和reify方法我們未定義, 所以我試了一下。但該頁面無法加載,並在瀏覽器中顯示此錯誤。 「504網關超時」Rails While Loop:無法加載頁面

v = self.versions.first 
if v.present? 
while v.try(:reify).try(:reason).try(:name).blank? do 
    v = v.try(:next) 
    end 
    v.reify.try(:reason).try(:name) 
end 

你有什麼建議我讓這段代碼更清潔,並防止它再次長時間頁面加載?

+0

您是否考慮過實施這些方法? – Stefan

+1

看起來像某種無限循環,如果你正在獲取網關超時。 –

回答

3

您的代碼如下循環的第一次迭代,這是一個無限循環

while nil.try(:reify).try(:reason).try(:name).blank? # always true 
    # ... 
end 

您的Web服務器放棄等待循環終止,因此報告後,有效地相同 - 504 - Gateway timeout用戶/瀏覽器。


try允許你調用一個nil對象的方法沒有拋出任何異常 - 如果對象是nil或者方法沒有實現,它將返回nil

所以,讓我們說v是一些物體,它沒有實現reify方法,那麼,v.try(:reify)nil

v = "Ruby" 
v = v.try(:reify) 
#=> nil 
v = v.try(:next) 
#=> nil 
v.try(:reify).try(:reason).try(:name).blank? 
#=> true 

只爲你的問題的解決方案是,以確保您的循環終止。

+0

所以現在應該看這個,對吧? 'v = self.versions.first if v.present? 而v.try(:reify).try(:reason).try(:name).blank?做: v = v.try(:next) end v.try(:reify).try(:reason).try(:name).blank? 結束' –

+0

@RailsCoder。如果不仔細查看「self.versions.first」的確切值,很難說。您將不得不通過檢查其價值進行調試。 –