0

各位早上好。在我的模型中,我创建了一种显示行的方法。该页面无法正常工作,因为 next 并 reify 我们未定义的方法,所以我尝试了它们。但是页面没有加载并且在浏览器上显示这个错误。“504网关超时”

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

你有什么建议我让这段代码更干净并防止它再次加载长页面?

4

1 回答 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

您的问题的唯一解决方案是确保您的循环终止。

于 2016-02-05T09:57:28.320 回答