Wie erhalte ich Rails Nachladen meine Edelsteine zu stoppen?
-
19-09-2019 - |
Frage
Ich habe ein Juwel:
# 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 lade es in Rails:
# in [rails_root]/config/environment.rb:
config.gem 'my_gem', :version => '1.0.0'
Und verwendet es:
# in [rails_root]/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
include MyGem
end
Aber ich muß Affen-Patch es ein bisschen in einer Umgebung spezifisch:
# in [rails_root]/config/environments/development.rb:
MyGem.class_eval do
def do_stuff
raise 'Ack! - just testing'
end
end
Leider MyGem
Reloads bei jeder Anfrage, so dass mein Affe Patchen ist nutzlos.
Ich habe geprüft load_once_paths
:
ActiveSupport::Dependencies.load_once_paths
# => ["/Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib", "other stuff"]
Jede Idee, wie ich die Wirkung erhalten kann ich will?
Lösung
Es scheint, Sie arbeiten im Entwicklungsmodus, wo Lasten alle Klassen in jeder Anfrage Rails den Entwickler zu helfen, den Code zu reflektieren ändert + Sie den Edelstein in Ihrem Controller aufgenommen haben. 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 zweite Lösung können Sie den moneky Patch hinzufügen, nachdem Sie Sie den Edelstein in diesem Controller enthalten. Sie können es auf der Unterseite des Controllers Datei hinzufügen.
Update 2 : Eine dritte Lösung (empfohlen) Wenn Sie das folgende Snippet hinzufügen können, um my_gem.rb
class ActionController::Base
include MyGem
end
, dann sollten die Dinge funktionieren, da Sie nicht von Hand müssen sie in Ihrer Anwendung Controller enthalten.
Andere Tipps
Wenn Sie das Juwel in Ihrem environment.rb
sind einschließlich sollten Sie nicht in Ihrem Controller enthalten müssen.
Sie möchten vielleicht darüber nachdenken, wie die Perle Haken in Action - es klingt wie Sie Klassenmethoden Action :: Base hinzufügen möchten, die recht einfach ist. Werfen Sie einen Blick darauf, wie viele gemeinsame gems dies umzusetzen.
Es klingt auch, wie Sie auch für die Existenz und Wert von RAILS_ENV
überprüfen möchten vielleicht ein anderes Verhalten für unterschiedliche Umgebungen zu gewährleisten.