Не могли бы вы рассказать мне, как константы инициализируются в драгоценном камне, загруженном в Rails?

#ruby-on-rails #ruby #initialization #gem

#ruby-на-рельсах #ruby #инициализация #драгоценный камень

Вопрос:

Мне интересно, как процесс инициализации работает с драгоценными камнями. В принципе, сегодня я столкнулся с проблемой, когда попытался вызвать константу, которая находится в моем приложении Rails, из Gem, который я включил в свой проект rails.

Константа — Air::Fly

Постоянная загрузка отлично работает с Rails, но Gem не может загрузить эту константу. Моя цель состояла в том, чтобы расширить класс приложения Rails из контекста Gem, чтобы сделать мой код более модульным.

Как я могу загрузить класс приложения rails из Gem?

Комментарии:

1. Убедитесь, что для Gem правильно установлена зависимость от времени выполнения Air , чтобы она загружалась до загрузки gem.

2. Воздух — это драгоценный камень, верно? Это не то, что просто определено в вашем приложении Rails? Вы просто добавляете его в gemspec : s.add_runtime_dependency "air" . Если это просто что-то определенное в вашем приложении Rails, то то, что вы пытаетесь сделать, не сработает. Драгоценный камень не может зависеть от вашего приложения. Вам нужно будет реорганизовать его так, чтобы вы передавали зависимости во время выполнения (внедрение зависимостей).

3. s.add_runtime_dependency сделал это. .. если вы ответите на этот вопрос, я приму ваш ответ. Спасибо!

4. Приятно слышать 🙂 Я дал правильный ответ для полноты картины.

Ответ №1:

Bundler разрешает зависимости драгоценных камней, проверяя файл gemspec на наличие зависимостей во время выполнения. Если у gemspec gem X есть gemspec add_runtime_dependency "Y" , то gem Y будет загружен раньше gem X.

Итак, предполагая, что Air — это драгоценный камень, в вашем случае вам нужно добавить в свой gemspec:

 s.add_runtime_dependency "air"
 

Это гарантирует, что он будет доступен для использования внутри вашего собственного драгоценного камня 😉