あなたの質問を読んだとき、このメカニズムがどのように機能するかわかりませんでした(かなり良いアイデアがありましたが)。これは、ソースコードをレールに読んで理解した方法です:
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
オプションクラス変数のキーのリストが表示されます