2017-06-13 1 views
1

Je suis en train de développer un Gem à utiliser exclusivement dans les projets Rails. Il a été développé dans le répertoire lib de l'application Rails et doit maintenant être extrait dans un Gem distinct.Quand faut-il charger le code Gem en fonction des rails?

Certaines classes dépendent de l'infrastructure Rails à charger. Deux exemples:

class OurGem::Hookup 
    CONFIG_PATH = 'config/hookup.rb'.freeze 
    [...] 
end 

class OurGem::RoutingContainer 
    include Rails.application.routes.url_helpers 
    [...] 
end 

Normalement, je charger le code Gem dans le fichier de module principal de la pierre à l'aide require. Mais comme il est chargé par bundler, Rails n'est pas prêt et des choses comme Rails.application et Rails.root ne peuvent pas être utilisées. Le premier exemple pourrait être contourné en n'évaluant pas le chemin au moment du chargement, mais le second me semble un peu compliqué.

Quelle est la bonne façon de faire cela? Enregistrer un initialiseur en utilisant un railtie et exiger les fichiers "délicats" là?

Répondre

2

Ceci est une configuration étrange, car votre gem dépend de votre application rails et votre application rails dépend de votre gemme.

Cela semble beaucoup trop couplé à moi. Avez-vous envisagé de créer un rails engine autonome que votre application principale monte à la place?

Vous pourrait être en mesure de sortir avec cette façon, si:

# Gemfile 
gem 'our_gem', require: false 

# config/initializers/our_gem.rb 
require 'our_gem' 
OurGem::Hookup.config_path = '...' 

Cela garantit que votre bijou est uniquement chargé après l'application rails initialise - donc des choses comme Rails.application.routes.url_helpers seront définies .

+0

Merci pour votre réponse. Eh bien, notre Gem ne fournit aucune fonctionnalité moteur (contrôleurs, routes, ...) lui-même, mais il fournit un mélange en utilisant les routes de l'application hôte. Je ne sais pas exactement comment un moteur Rails nous aiderait à faire cela. – Remo