0

irbで次のことを行うと:

module Useless ; end

Useless.const_defined? 'Test'

明らかに返ってきます

=> false

しかし、Rails Apps コンソールのいずれかで同じことを行うと、答えは次のようになります。

=> true

私の最初の推測は、何らかの形でテスト フレームワークと競合しているということでした。どれだろうと思っていたら、「true」が返ってきても未定義らしいことに気がついたらおかしくなっていました…

irb(main):004:0> Useless::Test
NameError: uninitialized constant Useless::Test
    from (irb):4
    from /home/laurent/.rvm/gems/ruby-2.0.0-p0@nanoscripts/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
    from /home/laurent/.rvm/gems/ruby-2.0.0-p0@nanoscripts/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
    from /home/laurent/.rvm/gems/ruby-2.0.0-p0@nanoscripts/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

誰かがこれについて説明していますか?

もちろん、モジュールに「Test」という名前を付けることは避けるべきであることはわかっていますが、ポイントは、データベースのイントロスペクションから一種の名前空間として使用するモジュールに、いくつかのクラスとモジュールを動的に生成しているということです。したがって、テーブルに test という名前を付けることを妨げるものは何もありません (これが私が発見した方法です)。これにより、次の名前のクラスの作成がトリガーされます。

MyNameSpaceForDynamicallyCreatedObjectsFromDatabase::Test

基本的に私は何をすべきですか?

  • テスト用に何かをハードコーディングしますか? そして、何かをハードコーディングする必要があるテーブル名の完全なリストはありますか?
  • 競合している基本的なメカニズムに干渉することなく、モジュールに定数が存在するかどうかを判断する別の方法はありますか?

どんな助けでも感謝します。Rgds

4

1 に答える 1

0

constants.include? 'Test'.to_sym実際、次の代わりにa を実行することで回避できましたconst_defined?

module Useless ; end

Useless.constants.include? 'Test'.to_sym

期待されるものを正しく返します。

=> false

そして、これは生のルビーとレールの両方にあります。

唯一の欠点は、定数がシンボルの配列を返すことです。const_defined?これは私の問題を解決しますが、この動作の理由を説明していません。

于 2013-05-12T06:36:24.980 に答える