Rails While Loop: не удается загрузить страницу
Доброе утро, ребята. В моей модели я создал метод для отображения строки. Страница не работала, потому что затем и методы 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 ответ
Ваш код фактически такой же, как показано ниже после первой итерации цикла, который представляет собой бесконечный цикл
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
Единственное решение вашей проблемы - убедиться, что ваш цикл завершается.