Файл и номер строки содержатся в обратном следе. Однако, в вашем случае, предупреждение находится внутри строки, которая eval
редактируется во время выполнения. Что означает нет файла . (На самом деле, метод eval
* принимает необязательные аргументы для имени файла и номера строки, которые должны отображаться в обратном следе, но в этом случае тот, кто написал код, о котором идет речь, к сожалению, забыл передать эти аргументы. )
Я боюсь, что у вас нет другого выбора, кроме как вручную проверять каждый отдельный вызов 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
d ! Другими словами: где-то в вашем приложении есть строка eval
d, длина которой не менее 289 строк! (На самом деле, более вероятно, что это сделано не в вашем приложении, а скорее в Rails. Маршрутизатор Rails был особенно плохим нарушителем, я не знаю, так ли это до сих пор.)