In app/services
habe ich einige Klassen, wie Notification::Finder
und Notification::Builder
.autoload_paths nicht bekannt, Namespace?
Sie werden als app/services/notification/builder.rb
und app/services/notification/finder.rb
platziert.
Es gibt auch die Notification
Klasse als Modell, bei app/models/notification.rb
Die autoload_path wie in config.autoload_paths += %W(#{config.root}/app/services)
konfiguriert ist, wenn ich versuche, Finder
zu laden, funktioniert es:
Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Finder
=> Notification::Finder
Aber wenn Ich versuche die Builder
, bekomme ich ein Problem mit den Schienen Autoloading:
Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Builder
=> ActiveRecord::Associations::Builder
Es ignoriert nur den Namespace, den ich verwendet habe, wenn der konstante Name (Builder) bereits von einem anderen Namespace definiert wurde, und erhält stattdessen die ActiveRecord::Associations::Builder
.
Ist dies das erwartete Verhalten oder ein Rails Bug?
gehen detaillierter, die const_missing
Verfahren bei activesupport/dependencies.rb
empfängt ein const_name 'Builder'
und nesting.inspect => 'nil'
.
Neugierig, dass, wenn ich constantize verwenden, ist es wie erwartet aufgelöst:
Loading development environment (Rails 3.2.9)
[1] pry(main)> 'Notification::Builder'.constantize
=> Notification::Builder
(Rails Problem bei Github: https://github.com/rails/rails/issues/8726)
Ist es möglich, dass 'Builder' ein reservierter Name ist? – tadman
@tadman es ist nicht =/ –
können Sie es in einer neuen Anwendung reproduzieren? Wenn ja, bitte gib mir Github und lass es mich wissen. Ich werde es mir ansehen. Es gibt Situationen, in denen der Rails-Autoloader das richtige Ergebnis nicht zurückgeben kann. Ich denke, das sollte möglich sein, aber ... –