0

すべての設定変数を取得したいのですが、Rails の設定についてよくわかりません...

config.myvarたとえば、 test.rb に次のようなものがあり、実行すると次のようになります。

MyApp::Application.config.myvar           # works
MyApp::Application.config.send("myvar")   # works as well

私が正しければ、ドキュメントで指定されているように、それは関数であると想定できます。それでも、呼び出すmethodsと(多くの)メソッドが提供されますが、私のものではありません...同じinstance_variablesか、私が試すことができるものなら何でも。

手がかりがあれば、明らかに私が見逃しているものがあります:)

4

1 に答える 1

1

あなたの質問を読んだとき、このメカニズムがどのように機能するかわかりませんでした(かなり良いアイデアがありましたが)。これは、ソースコードをレールに読んで理解した方法です:

Rails アプリケーションの構成は、Rails ソースの rails/railties/lib/rails/application.rb の下の rails にあります。次のような構成オブジェクトが作成されることがわかります。

def config #:nodoc:
  @config ||= Application::Configuration.new(find_root_with_flag("config.ru", Dir.pwd))
end

Application::Configurationしたがって、rails/railties/lib/rails/application/configuration.rbを追跡できます。

ただし、これはかなり小さなクラスであり、任意のメソッドを呼び出すことはできません。チェーンを上ってみましょう。これは の子な::Rails::Engine::Configurationので、このファイルに移動します。(正しくフォローしている場合は rails/railties/lib/rails/engine/configuration.rb )。

繰り返しますが、一連の関数が定義されたかなり小さなクラスです。ただし、これには親クラスもあります。::Rails::Railtie::Configuration. このファイルのソース (rails/railties/lib/rails/railtie/configuration) を確認します。

そして最後に、人気のある#method_missingがあります。

  def method_missing(name, *args, &blk)
    if name.to_s =~ /=$/
      @@options[$`.to_sym] = args.first
    elsif @@options.key?(name)
      @@options[name]
    else
      super
    end
  end

これを読むと、名前に が含まれているかどうかがわかり=ます。クラス変数のオプション ハッシュを最初の引数と等しくなるように設定し、呼び出したメソッドの名前を (シンボル化した後) キーとして使用します。それ以外の場合は、そのキーのコンテンツをオプション ハッシュで返します。ただし、このように機能するため、どちらも#methods機能しません#instance_variables。ただし、このファイルをもう一度読むと、rails がオプションを提供していることがわかります。

  def respond_to?(name)
    super || @@options.key?(name.to_sym)
  end

キーが設定されている場合、これは true を返します。

リストを取得するには、次のことができます。

MyApp::Application.config.class_variable_get(:@@options).keys

オプションクラス変数のキーのリストが表示されます

于 2013-04-03T16:00:53.387 に答える