Загрузка модулей в каталог lib на Heroku - PullRequest
0 голосов
/ 20 мая 2011

У меня есть файл в каталоге lib проекта rails 3, который называется slot.rb. Он создает модуль с именем SojournerSupport и содержит класс с именем Slot. У меня есть следующий файл config / application.rb:

config.autoload_paths += %W(#{config.root}/lib)

Затем я включаю модуль в модель, которая мне нужна, вот так:

include SojournerSupport

Это прекрасно работает локально на моей машине, но при попытке запустить приложение в heroku оно говорит: «неинициализированная константа ShipRecord :: SojournerSupport (NameError)» ShipRecord - это название модели, в которую я включаю модуль.

Есть идеи или предложения?

Ответы [ 4 ]

3 голосов
/ 06 сентября 2011

У меня была похожая проблема с запуском модуля на Heroku.В дополнение к соглашению об именах автозагрузки я обнаружил, что код модуля должен быть необходим из-за многопоточного предположения, сделанного производственной средой Rails на Heroku (даже если это было закомментировано в моем файле production.rb.) Как толькоЯ «требовал» файл модуля, прежде чем для вызова «включить» на модуле, все начало работать.

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

http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-classes-in-production/

0 голосов
/ 21 мая 2011

Не столько решение, сколько способ получить больше информации, но пытались ли вы запустить rails с вашей рабочей конфигурацией с локального компьютера (используя rails s production)?

Если вы столкнетесь с той же проблемой, я изучу ваш файл production.rb, чтобы выяснить, не странно ли он работает с вашими путями автозагрузки.

Вы также можете загрузить консоль в свою производственную среду (или консоль heroku) и изучить файл Application.config, чтобы убедиться, что пути загрузки соответствуют ожидаемым.

Наконец, одна из первых вещей, которые я проверяю, когда вижу несовместимое поведение Heroku / dev, - это убедиться, что я использую подходящую версию ruby. Heroku по-прежнему использует или недавно использовал 1.8.7 по умолчанию.

0 голосов
/ 21 мая 2011

На самом деле удалось выяснить решение.Я не уверен, почему heroku зависал на странице индекса, но когда я нажал на контроллер, который использует модель, загружаемую в библиотечный модуль, это также дало бы мне ошибку.Может показаться, что config.autoload_paths ожидает, что имя файла совпадает с именем модуля (как отмечено здесь: Библиотека Rails 3 не загружается, пока не потребуется ).Я переименовал имя файла в каталоге lib как таковое, и теперь оно работает локально.Я доберусь до героку, когда вернусь домой, но я думаю, что это решило проблему:).

0 голосов
/ 20 мая 2011

Если SojounerSupport является классом или модулем верхнего уровня, то вам, возможно, придется явно указать, что это так при включении.

include ::SojournerSupport
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...