Контроллер Rails обрабатывает несоответствия разработка / производство - PullRequest
0 голосов
/ 17 июня 2020

Резюме: в процессе разработки запросы направляются на workouts_controller.rb, а в производстве - на workouts_controllerPrev.rb

В приложении Rails 5.2.3 у меня есть файл workouts_controller.rb в папка controllers/ с первой строкой:

WorkoutsController < ApplicationController

Я взял копию workouts_controller.rb (в качестве быстрой справочной резервной копии), которую я переименовал в workouts_controllerPrev.rb и сохранил в папке controllers/ .

Затем я ввел некоторые новые функции в workouts_controller.rb. Я протестировал новую функциональность локально (она работала, как ожидалось, в процессе разработки), а затем я развернул ее на Heroku (v 7.42.0) (для производства).

Новая функциональность, однако, не работала в производственной среде. После некоторой отладки я обнаружил, что при производстве WorkoutsController class в workouts_controllerPrev.rb обрабатывает вызовы Workouts controller (а не Workouts controller, определенный в workouts_controller.rb (как ожидалось и как происходит в разработке).

Я сделал более драматичное изменение имени c на workouts_controllerPrev.rb, изменив его на Xwurkouts_controllerPrev.rb, и изменил имя класса в этом файле на XWurkoutsController повторно развернуто, и все сработало нормально.

Что здесь происходит? Почему Rails по-разному работает в этом отношении в двух средах? Это ошибка или неудивительное последствие плохой практики, когда неиспользуемые файлы слоняются по сторонам? Если ошибка, куда я должен сообщить об этом? Я с использованием SQLite в разработке и PostGreSQL в производстве, но я не вижу, что это может быть проблемой базы данных? Рабочий веб-сервер - Puma.

Спасибо за любые указания

Daniel

1 Ответ

0 голосов
/ 17 июня 2020

Проблема в том, что оба файла имеют одинаковое имя класс в них, поэтому действия (методы) в зависимости от того, какой из них загружен последний , переопределят действия, определенные в загруженном first .

Если вы хотите сохранить оба файла и не получать неожиданных результатов, измените имя class в старом файле на другое, например PrevWorkoutsController.

Или сохраните его в ветке в Git, чтобы он не загромождал ваш текущий код.


Чтобы ответить, почему вы получили разные результаты в разных средах, это из-за разницы между автозагрузкой и активной загрузкой. Rails использует автозагрузку в разработке, но он нетерпеливо загружает все заранее в продакшене, затем отключает автозагрузку .

Другими словами, в разработки, Rails будет перезагружать класс из соответствующего файла каждый раз при сохранении этого файла. В производстве он просто загружает все файлов заранее, поэтому выигрывает тот, который загружается последним.

Вы можете узнать больше здесь .

...