In app/services
, ho alcune classi, come Notification::Finder
e Notification::Builder
.autoload_paths non è a conoscenza dello spazio dei nomi?
Sono posizionati come app/services/notification/builder.rb
e app/services/notification/finder.rb
.
C'è anche la classe Notification
come modello, a app/models/notification.rb
L'autoload_path è configurato come in config.autoload_paths += %W(#{config.root}/app/services)
Quando provo a caricare Finder
, funziona:
Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Finder
=> Notification::Finder
Ma quando Provo il Builder
, ottengo un problema con il caricamento automatico dei binari:
Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Builder
=> ActiveRecord::Associations::Builder
Ignora semplicemente lo spazio dei nomi che ho usato quando il nome della costante (Builder) è già stato definito da un altro spazio dei nomi e ottiene invece il ActiveRecord::Associations::Builder
.
È questo il comportamento previsto o un baco?
Andando più dettagliato, il metodo const_missing
a activesupport/dependencies.rb
riceve un const_name 'Builder'
e nesting.inspect => 'nil'
.
Curioso che quando uso constantize, si risolve come previsto:
Loading development environment (Rails 3.2.9)
[1] pry(main)> 'Notification::Builder'.constantize
=> Notification::Builder
(problema Rails a github: https://github.com/rails/rails/issues/8726)
È possibile che 'Builder' sia un nome riservato? – tadman
@tadman non è =/ –
puoi riprodurlo in una nuova applicazione? Se è così, per favore mettine uno su github e fammi sapere. Darò un'occhiata. Ci sono situazioni in cui il caricatore automatico delle rotaie non sarà in grado di restituire il risultato corretto. Penso che questo dovrebbe essere possibile ... –