Vic*_*ues 5 ruby ruby-on-rails ruby-on-rails-3 ruby-1.9.3 ruby-on-rails-3.2
在app/services,我有一些课,as 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
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)
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)
这是预期的行为吗?
是的
好吧,那么...你有什么选择?
更多信息:
* http://www.rubydoc.info/docs/rails/3.1.1/ActiveRecord/Associations/Builder/Association
* http://apidock.com/rails/ActiveRecord/Associations/Builder