Номер файла и строки содержится в обратной линии. Однако в вашем случае предупреждение находится внутри строки eval
ed во время выполнения. Что означает нет файла. (На самом деле, eval
метод делает принять дополнительные аргументы для имени файла и номер строки, которые должны быть отображены в трассировке, но в этом случае тот, кто написал код, о котором идет речь, к сожалению, забыл передать эти аргументы.)
I боюсь, что у вас нет другого выбора, кроме как вручную просмотреть каждый звонок до eval
на всей вашей кодовой базе и что включает в себя Rails, вашу тестовую инфраструктуру, все ваше приложение, ваши тесты, ваши плагины, ваши помощники, стандартную библиотеку ruby, ...
Конечно, вы должны знать, что проблема может быть не очевидна, как в
eval 'foo (bar, baz)'
Это также может быть что-то вроде
def foo(*args)
puts args.join
end
bar = 'Hello'
baz = 'World'
foostr = 'foo' # in one file
barstr = 'bar' # in another file in a different directory
bazstr = 'baz' # in another file in a different directory
argstr = "(#{barstr}, #{bazstr})" # in yet another file
$, = ' ' # in some third-party plugin
str = [foostr, argstr].join # in a fourth file
eval str # somewhere else entirely
eval str, binding, __FILE__, __LINE__ # this is how it *should* be done
Обратите внимание на разницу между двумя предупреждениях: первый читает так же, как тот, который вы в курсе, но второй один имеет имя файла вместо (eval)
и номер строки внутри файла вместо номера строки внутри строки eval.
Кстати: номер строки 289
в сообщении предупреждения является номер строки внутри eval
й строки! Другими словами: где-то в вашей заявке есть строка eval
d, которая равна не менее 289 строк длиной! (На самом деле, скорее всего, это произошло не в вашем приложении, а в Rails. Rails-маршрутизатор был особенно плохим преступником, я не знаю, если это все еще так.)
* крики * Это серьезный код для просмотра! – Daniel