【问题标题】:Rails While Loop: Can't load a pageRails While Loop:无法加载页面
【发布时间】:2016-05-15 05:12:47
【问题描述】:

大家早上好。在我的模型中,我创建了一种显示行的方法。 该页面无法正常工作,因为 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

你有什么建议让我的代码更简洁,并防止它再次加载长页面?

【问题讨论】:

  • 您是否考虑过实施这些方法?
  • 如果网关超时,看起来像是某种无限循环。

标签: ruby-on-rails ruby while-loop activeadmin reify


【解决方案1】:

在循环的第一次迭代之后,您的代码实际上与下面相同,这是一个无限循环

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

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

【讨论】:

  • 所以现在应该是这个样子,对吧? 'v = self.versions.first if v.present?而 v.try(:reify).try(:reason).try(:name).blank?做 v = v.try(:next) 结束 v.try(:reify).try(:reason).try(:name).blank?结束'
  • @RailsCoder。如果不查看self.versions.first 的确切值,很难说。您必须通过检查其值来进行调试。
猜你喜欢
  • 2011-10-22
  • 2020-10-30
  • 2016-08-06
  • 2021-12-15
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多