Ruby on Rails 5.2.8 および Ruby 2.7.8 バージョンを使用していますが、コードにバグを見つけました。コードは、モデルが定義されているかどうかを実行時にチェックする必要があります。最初は定義されたものを使用しようとしました?メソッドですが、開発環境がモジュールを遅延ロードするため、(私にとって)予期しない動作が発生しました。
defined?(ModelToCheck) #=> nil
ModelToCheck
defined?(ModelToCheck) #=> true
したがって、モデルを使用した後でのみ、モデルが定義されているように見えます。定義されているかどうかを確認する最良の方法は何ですか?
追伸
遅延読み込みを構成するオプションは次のとおりです。
# config/environments/development.rb
ExampleApp::Application.configure do
config.eager_load = false
# rest of the config
# ...
end
とりあえずObject.const_define?も使ってみました。方法ですが、また同じ話です。
私には 2 つの考えがあります:
質問の作成者は #define? を使用したくなかったので、それともObject.const_define?自動読み込みの問題のため、別の解決策を思いつきました。
それでも最善の解決策は自動読み込みの問題を修正することですが、プロジェクトの内部を知らずにそれを判断するのは困難です。
これを実現する方法は、#missing_name または #missing_name? を使用することです。そしてスローされた NameError をレスキューします。
begin
HelloWorld
rescue NameError => e
e.missing_name
end
# => "HelloWorld"
詳細についてはドキュメントを参照してください。
これは醜いので、これを次のようなメソッドにラップすることもできます。
def check_defined(constant)
begin
!!Oject.const_get(constant)
rescue NameError => e
!e.missing_name?(constant)
end
end