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

Единственное решение вашей проблемы - убедиться, что ваш цикл завершается.

Другие вопросы по тегам