2012-11-16 23 views
7

これは典型的なconfig/environments/*.rbファイルが始まる方法です:設定記号が環境に解決される方法/ * Rbが

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

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

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

また、私はRails initialization procedureを徹底的に研究しており、config/environments/*.rbファイルについても言及していません。これらのファイルがinitプロシージャによってどのように扱われているかを知っていれば、これはいくつかのことを明らかにするかもしれません。

答えて

2

lib/rails/application/configuration.rbで定義され、Application::Configurationのインスタンスを返すlib/rails/application.rbにrailties宝石でRails::Application方法configです。

configure

方法はautoload EDモジュールConfigurablelib/rails/railtie/configurableからRailtieに寄与し、configureが受け入れるブロックconfigシンボルを解決することができる理由を説明

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

として定義されます。 class_evalは、ルビズムの魔法の一部です。これは、渡されたブロックのselfシンボルをコールサイトのクラスに再バインドします。

/config/environmentsディレクトリがどのように処理されるのかを含めて、ブートプロセスの最初のファイルのコメントを確認してください。

+0

[こちら](https://raw.github.com/rails/rails/b04ec2764f62d5734c57959e2f00f9ef4345d52e/railties/lib/rails/application.rb)のファイルを確認しましたが、 'configure'を検索すると何も表示されません。私は間違ったバージョンを見ていますか? –

+0

明らかに、私は 'config'を見つけることができますが、' configure'に渡されたブロックがその宣言コンテキストからそのメソッドをどのように見ることができるかは説明していません。私は 'ENV.rb'から呼び出されている' configure'メソッドを探しています。 –

+1

'lib/rails/railtie/configurable#configure'はこのメソッドが' def configure(&block);で定義されている主要な場所です。 class_eval(&block);あなたが探しているブロックですよね? –

関連する問題