Domanda

Ho un gioiello:

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

E ho caricato in Rails:

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

E usato:

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

Ma ho bisogno di scimmia-patch è un po 'in modo specifico per l'ambiente:

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

Purtroppo, ricariche MyGem su ogni richiesta, quindi la mia scimmia-patching è inutile.

load_once_paths

Ho controllato:

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

Qualsiasi idea di come posso ottenere l'effetto che voglio?

È stato utile?

Soluzione

Sembra che si sta lavorando in modalità di sviluppo, dove i carichi Rotaie tutte le classi in ogni richiesta per aiutare lo sviluppatore in modo da riflettere il codice cambia + aver incluso la gemma nel controller. Per superare questo vai project_path / config / ambienti / development.rb e aggiungere questa riga

config.cache_classes = true 

Si noti che non sarà necessario le modifiche di codice riflesse a meno che non si riavvia il server.

Aggiorna 1 : Anche come una seconda soluzione è possibile aggiungere la patch moneky dopo si include la gemma in tale controller. È possibile aggiungere alla fine del file di controllo.

Update 2 : Una terza soluzione (consigliato) Se è possibile aggiungere il seguente frammento di my_gem.rb

class ActionController::Base
  include MyGem
end

poi le cose dovrebbero funzionare in quanto non sarà necessario includere manualmente nel controllore dell'applicazione.

Altri suggerimenti

Se stai compresa la gemma nella vostra environment.rb non dovrebbe essere necessario includere nel vostro controller.

Si potrebbe desiderare di pensare a come i ganci gemma in ActionController - che suona come si desidera aggiungere metodi della classe per ActionController :: Base, che è abbastanza semplice. Date un'occhiata a quanti gemme comuni implementano questa.

Sembra troppo, come si potrebbe anche voler verificare l'esistenza e il valore di RAILS_ENV per garantire un comportamento diverso per ambienti diversi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top