Question

J'ai un petit bijou:

# in /Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib/my_gem.rb
module MyGem
  def do_stuff
    ..
  end
end

Et je chargé dans Rails:

# in [rails_root]/config/environment.rb:
config.gem 'my_gem', :version => '1.0.0'

Et utilisé:

# in [rails_root]/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  include MyGem
end

Mais je dois singe-patch un peu de manière spécifique à l'environnement:

# in [rails_root]/config/environments/development.rb:
MyGem.class_eval do
  def do_stuff
    raise 'Ack! - just testing'
  end
end

Malheureusement, rechargements de MyGem sur chaque demande, donc mon singe ragréage est inutile.

J'ai vérifié load_once_paths:

ActiveSupport::Dependencies.load_once_paths
# => ["/Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib", "other stuff"]

Toute idée comment je peux obtenir l'effet que je veux?

Était-ce utile?

La solution

Semble que vous travaillez en mode de développement où Rails charge toutes les classes dans chaque demande d'aider le développeur à refléter le code change + vous avez inclus la pierre précieuse dans votre contrôleur. Pour remédier à ce rendez-vous à project_path / config / environnements / development.rb et ajoutez cette ligne

config.cache_classes = true 

Notez que vous n'aurez pas vos modifications de code réfléchi à moins que vous redémarrez le serveur.

Mise à jour 1 : De plus comme une deuxième solution, vous pouvez ajouter le patch Moneky après que vous vous incluez la pierre précieuse dans ce contrôleur. Vous pouvez l'ajouter au fond de votre fichier contrôleur.

Mise à jour 2 : Une troisième solution (recommandé) Si vous pouvez ajouter l'extrait suivant à my_gem.rb

class ActionController::Base
  include MyGem
end

alors les choses devraient fonctionner comme vous ne aurez pas besoin d'inclure manuellement dans votre contrôleur d'application.

Autres conseils

Si vous incluez la pierre précieuse dans votre environment.rb vous ne devriez pas avoir de l'inclure dans votre contrôleur.

Vous voudrez peut-être penser à la façon dont les crochets de pierres précieuses dans ActionController - il semble que vous voulez ajouter des méthodes de classe à ActionController :: Base, ce qui est assez simple. Jetez un oeil à combien de pierres précieuses communes mettre en œuvre.

Il semble aussi, comme vous pouvez même vérifier l'existence et la valeur de RAILS_ENV pour assurer un comportement différent pour différents environnements.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top