には、asと。app/services
のクラスがいくつかあります。Notification::Finder
Notification::Builder
それらはととして配置されapp/services/notification/builder.rb
ますapp/services/notification/finder.rb
。
Notification
モデルとしてのクラスもあります。app/models/notification.rb
autoload_pathは次のように構成されますconfig.autoload_paths += %W(#{config.root}/app/services)
ロードしようとするとFinder
、次のように機能します。
Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Finder
=> Notification::Finder
しかし、を試してみるBuilder
と、レールの自動読み込みで問題が発生します。
Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Builder
=> ActiveRecord::Associations::Builder
定数名(Builder)が他の名前空間によってすでに定義されている場合に使用した名前空間を無視し、ActiveRecord::Associations::Builder
代わりに取得します。
これは予想される動作ですか、それともレールのバグですか?
さらに詳しく説明すると、のconst_missing
メソッドは、、およびをactivesupport/dependencies.rb
受け取ります。const_name 'Builder'
nesting.inspect => 'nil'
不思議なことに、constantizeを使用すると、期待どおりに解決されます。
Loading development environment (Rails 3.2.9)
[1] pry(main)> 'Notification::Builder'.constantize
=> Notification::Builder
(githubでのRailsの問題:https ://github.com/rails/rails/issues/8726 )