© 2024 WebHive

Проблемы при апгрейде rails приложения до версии 5.2

Довелось тут на днях обновить одно рельсовое приложение. Казалось бы ничего хитрого — минорный апдейт с версии 5.1 до 5.2, однако возникли некоторые неожиданные проблемы. Думаю такие косяки возникли не только лишь у меня, поэтому спешу поделиться своими находками.

Итак после обновления и проверки всех изменений приложение было приведено в более-менее запускабельный вид и настала пора прогнать тесты — благо они были. Результат мягко говоря удивил — свалилось с ошибкой практически всё что могло свалиться. И самое неприятное, что ошибка-то вполне банальная — ошибка валидации по полям, которое были в общем-то и необязательны.

Belongs To по умолчанию стал обязательным

Долго и мучительно ковырялся с этим случаем и в итоге обратил внимание, что проблемные случаи относятся только варианту с belongs_to. Вооружившись этим знанием быстро нагуглил источник зла, а именно теперь у нас все, что объявлено как belongs_to автоматически валидируется как presence: true.

По счастью это прогрессивное нововведение можно выключить, используя опцию:

Rails.application.config.active_record.belongs_to_required_by_default = false

Подробнее про это можно почитать тут — https://blog.bigbinary.com/15.02.2016/rails-5-makes-belong-to-association-required-by-default.html Хотя статья и старая и утверждает, что все эти чудеса начались с версии 5, но я думаю автор не совсем прав, ибо обновлялся я с версии 5.1

После исправления этого нюанса тесты заработали бодрее, но всё-таки не идеально — осталось 4 проблемных случая.

Перестали отслеживаться изменения аттрибутов

Самое неприятное, что случаи эти ничем не выделялись, но в итоге опять нашлось нечто общее, что позволило мне локализовать и решить проблему, а именно — во всех случаях использовалось отслеживание изменения аттрибута модели с последующей реакцией на него. Ну и далее уже оказалось, что методы модели model.<аттрибут>_changed? больше не работают. Ну и далее выяснилось, что теперь нужно использовать методы model.saved_change_to_<аттрибут>?.

Подробнее об этом тут https://www.levups.com/en/blog/2017/undocumented-dirty-attributes-activerecord-changes-rails51.html

Итог

Я свои тесты починил. Надеюсь кому-то эти заметки смогут облегчить их трудовые будни

Комментарии