autoload_paths不知道命名空间?

Vic*_*ues 5 ruby ruby-on-rails ruby-on-rails-3 ruby-1.9.3 ruby-on-rails-3.2

app/services,我有一些课,as Notification::FinderNotification::Builder.

他们被安置为app/services/notification/builder.rbapp/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
Run Code Online (Sandbox Code Playgroud)

但是当我尝试时Builder,我遇到了rails自动加载的问题:

Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Builder
=> ActiveRecord::Associations::Builder
Run Code Online (Sandbox Code Playgroud)

它只是忽略了当常量名称(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
Run Code Online (Sandbox Code Playgroud)

(Rails在github上发布:https://github.com/rails/rails/issues/8726)

Jes*_*ott 2

ActiveRecord::Associations::Builder 是 Rails 中的一个模块。如果你有一个Notification::Builder,你可以询问它的类:

>> Notification::Builder
=> ActiveRecord::Associations::Builder
>> Notification::Builder.class
=> Module
>> Notification::Builder.ancestors
=> [ActiveRecord::Associations::Builder]
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?

是的

好吧,那么...你有什么选择?

  • 您可以使用与 Builder 不同的术语。就像工厂一样。或通知::NotificationBuilder

更多信息:
* http://www.rubydoc.info/docs/rails/3.1.1/ActiveRecord/Associations/Builder/Association
* http://apidock.com/rails/ActiveRecord/Associations/Builder