Rails While Loop:无法加载页面

时间:2016-02-05 09:30:03

标签: ruby-on-rails ruby while-loop activeadmin 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

您建议我如何使此代码更清晰,并防止再次加载长页面?

1 个答案:

答案 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

只有解决问题的方法是确保循环终止。