3 Stimmen

Verstehen der Rails-Konfiguration

Also... Zuerst sollte ich mein Ziel klar machen. Mein Ziel ist es, eine Umgebung definiert Konstante mit Attributen aus einer Yaml-Datei, die meine app verweisen kann gefüllt haben.

Das einfachste Beispiel, das ich geben kann, ist folgendes:

# initalizers/config.rb

CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[RAILS_ENV]

# config.yml:

production:
  host:
    foo.com

development:
  host:
    localhost
  port:
    3000

# config/environments/development.rb

Foo::Application.configure do
  #...
  config.action_mailer.default_url_options = { :host => CONFIG[:host], :port => CONFIG[:port] }

  config.after_initialize do
    Rails.application.routes.default_url_options = { :host => CONFIG[:host], :port => CONFIG[:port] }
  end
end

Meine Probleme sind:

Die Konstante "CONFIG" existiert nicht vor dem after_initialize-Block (offensichtlich, weil CONFIG als Teil des Initialisierungsprozesses festgelegt wird), also muss ich dies in den after_initialize-Block verschieben, aber ich kann nicht auf "config.action_mailer" innerhalb des after_initialize-Blocks verweisen, weil "config" nicht in diesem Bereich existiert... Das ist wirklich verwirrend für mich. Sollte "config" nicht innerhalb des Blocks zugänglich sein, da es außerhalb des Blocks existiert?

Und als eine Nebenfrage, ich bin wirklich wirklich wirklich verwirrt, wie diese config.x Geschäft funktioniert. Der Block liefert keine Variablen, also wie ist "config" überhaupt gültig im Kontext von Foo::Application.configure?

Ich denke, damit es überhaupt funktioniert, sollte es so sein:

Foo::Application.configure do |config|

Aber das ist nicht der Fall, also bin ich wirklich neugierig, wie das funktioniert

0voto

tadman Punkte 200181

Wenn Sie Ihren Konfigurationslader innerhalb von config/application.rb anstelle eines Initialisierers sollten Sie in der Lage sein, den Aufruf von configure und alles rechtzeitig vorbereiten.

Manchmal ist es am besten, eine Unterklasse zu erstellen, die Konfigurationsdateien bearbeitet. Ein sehr einfaches Beispiel ist dieses:

class Foo::Configuration
  def initialize
    # Read in contents of config file
  end

  def method_missing(name)
    @config[name.to_s]
  end
end

Dann definieren Sie in Ihrer Anwendung eine Methode wie diese:

class Foo::Application
  def self.config
    @config ||= Foo::Configuration.new
  end
end

Diese wird bei Bedarf automatisch geladen. Außerdem wird so eine unübersichtliche Konstante vermieden, die im Kontext jedes einzelnen Objekts auftaucht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X