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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top