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 :(得分:3)
首次循环迭代后,您的代码与下面的代码完全相同,这是一个无限循环
while nil.try(:reify).try(:reason).try(:name).blank? # always true
# ...
end
您的网络服务器在等待循环终止时放弃,因此向用户/浏览器报告 - 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
只有解决问题的方法是确保循环终止。