Довелось тут на днях обновить одно рельсовое приложение. Казалось бы ничего хитрого — минорный апдейт с версии 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
Итог
Я свои тесты починил. Надеюсь кому-то эти заметки смогут облегчить их трудовые будни
Комментарии