0

Ich habe ein Juwel:Wie bekomme ich Rails, um das Laden meiner Edelsteine ​​zu stoppen?

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

Und ich lud es in Rails:

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

und benutzte es:

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

Aber ich muss Affen-Patch es ein bisschen in ein umgebungsspezifischer Weg:

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

Leider lädt MyGem bei jeder Anfrage neu, so dass mein Affe-Patching nutzlos ist.

Ich habe load_once_paths geprüft:

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

eine Ahnung, wie ich die Wirkung Ich möchte bekommen?

Antwort

3

Scheint, dass Sie im Entwicklungsmodus arbeiten, in dem Rails alle Klassen in jeder Anfrage lädt, um dem Entwickler zu helfen, die Codeänderungen widerzuspiegeln + Sie haben den Edelstein in Ihren Controller aufgenommen. Um dies zu überwinden gehen zu project_path/config/Umgebungen/development.rb und fügen Sie diese Zeile

config.cache_classes = true 

Beachten Sie, dass Sie nicht Ihre Änderungen am Code haben reflektiert, wenn Sie den Server neu starten.

Update 1: Auch als eine zweite Lösung können Sie den Money-Patch hinzufügen, nachdem Sie den Edelstein in diesem Controller enthalten. Sie können es am Ende Ihrer Controller-Datei hinzufügen.

Update 2: Eine dritte Lösung (empfohlen) Wenn Sie das folgende Snippet

class ActionController::Base 
    include MyGem 
end 

dann sollten die Dinge funktionieren, wie Sie manuell schließen sie brauchen nicht zu my_gem.rb hinzufügen können in Ihr Anwendungscontroller.

0

Wenn Sie den Edelstein in Ihre environment.rb einschließen, sollten Sie ihn nicht in Ihren Controller einbeziehen.

Vielleicht möchten Sie darüber nachdenken, wie sich der Edelstein in ActionController einklinkt - es klingt, als würden Sie ActionController :: Base Klassenmethoden hinzufügen, was ziemlich einfach ist. Sieh dir an, wie viele gängige Edelsteine ​​dies implementieren.

Es klingt auch, als ob Sie sogar für die Existenz & Wert von RAILS_ENV überprüfen möchten, um unterschiedliches Verhalten für verschiedene Umgebungen zu gewährleisten.

+0

Ich bin _requiring_ es (implizit) in environment.rb; Ich schließe _ es in ApplicationController ein. Das sind sehr unterschiedliche Aktionen. Ich frage mich, warum Rails das Juwel jedes Mal neu lädt, wenn es ApplicationController neu lädt. Der Beweis dafür ist, dass mein Affenflicken weggeht. –

Verwandte Themen