8

これは、典型的なconfig/environments/*.rbファイルの開始方法です。

MyApp::Application.configure do
  config.cache_classes = false
  ...
end

に渡されたブロックは、明らかにバインドされていないconfigureシンボルを逆参照しています。configこれは技術的にどのように機能しますか?block/Proc/lambda で使用されるシンボルは、その宣言のコンテキストでバインドする必要があり、呼び出しサイトの動的スコープで解決するために放置する必要はありません。

関連する質問は、Application.configureメソッドが宣言されている正確な場所はどこですか? application.rbengine.rb、またはのいずれにもありませんrailtie.rb。たぶん、この方法を見つけることができれば、私の主な質問に対する答えを見つけることができたでしょう.

また、関連して、Rails の初期化手順を非常に詳細に調べましたが、ファイルについての言及すら見つかりませんconfig/environments/*.rb。これらのファイルが init プロシージャによってどのように処理されるかを知っていれば、これに光が当たる可能性があります。

4

1 に答える 1

3

で定義された のインスタンスを返すrailties gemのメソッドconfigです。Rails::Applicationlib/rails/application.rbApplication::Configurationlib/rails/application/configuration.rb

メソッドconfigureはed モジュールRailtieから提供され、次のように定義されます。autoloadConfigurablelib/rails/railtie/configurable

def configure(&block)
  class_eval(&block)
end

configureこれは、受け入れるブロックがconfigシンボルを解決できる理由を説明しています。class_evalこれを機能させるもう 1 つの ruby​​ist マジックがあることに注意してください。これは、渡されたブロックのselfシンボルを呼び出しサイトのクラスに再バインドします。

/config/environmentsBooting Process セクションの最初のファイルのコメントを確認してください。ここには、ディレクトリの処理方法を含め、このすべての利点がどこから、どのように、どのような順序でもたらされるかが説明されています。

于 2012-11-16T21:03:52.403 に答える