Обновление с RoR 4.2 до 5.1 - просмотр элемента массива "[...]" в массиве сообщений ActiveModel :: Errors - PullRequest
0 голосов
/ 31 декабря 2018

При обновлении с Rails 4.2 до Rail 5 возникла ошибка устаревания:

ПРЕДУПРЕЖДЕНИЕ О УСТАРЕВАНИИ: набор ActiveModel :: Errors # устарел и будет удален в Rails 5.1.Вместо этого используйте model.errors.add (: foo, ["required"]).

Хорошо, достаточно просто.Поэтому я изменил его на model.errors.add(:foo, ['message']), однако затем одна из моих спецификаций начала переходить в бесконечный цикл (из того, что я мог сказать, это было связано с массивом с самоссылкой, передаваемым в рендер, а затем с методом to_json).

Итак, я бросил pry и заметил, что ошибки в моей модели включают странный элемент [...]:

["is required", [...]]

Выше, что происходит, когда я вызываю метод add против set метод.С другой стороны, метод set просто возвращает ["is required"] - без второго элемента [...].Когда я пытаюсь сослаться на этот элемент - он просто возвращает весь массив:

> result.second
=> ["is required", [...]]

Другая интересная находка заключается в том, что когда я вызываю object_id для него, он указывает на родительский массив:

> result.object_id
=> 47158376546320
> result.second.object_id
=> 47158376546320

Итак, мой вопрос:

  1. Почему метод add добавляет второй элемент массива, который является просто ссылкой на сам массив?

Примечание:для справки я на самом деле на 5.0.6, еще не обновился до 5.1.

1 Ответ

0 голосов
/ 31 декабря 2018

Сообщения были сохранены в локальной переменной, которая непосредственно ссылалась на экземпляр ошибки, который также вызвал бесконечный цикл.Я решил продублировать его, а затем выполнить итерацию по массиву, чтобы добавить каждое сообщение отдельно:

messages.dup.each { |m| record.errors.add(attribute, message: m) }

Это, похоже, делает это!

...