W app/services
mam kilka klas, jako Notification::Finder
i Notification::Builder
.autoload_paths nie zna przestrzeni nazw?
Są one umieszczane jako app/services/notification/builder.rb
i app/services/notification/finder.rb
.
Istnieje również klasa Notification
jako model, w app/models/notification.rb
autoload_path jest skonfigurowany jak w config.autoload_paths += %W(#{config.root}/app/services)
Kiedy próbuję załadować Finder
, to działa:
Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Finder
=> Notification::Finder
Ale kiedy Próbuję Builder
, pojawia się problem z automatycznym ładowaniem szyn:
Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Builder
=> ActiveRecord::Associations::Builder
Po prostu ignoruje przestrzeń nazw, której użyłem, gdy stała nazwa (Builder) została już zdefiniowana przez inną przestrzeń nazw i otrzymuje zamiast niej ActiveRecord::Associations::Builder
.
Czy jest to oczekiwane zachowanie, czy błąd szyny?
Idąc bardziej szczegółowy, metoda const_missing
na activesupport/dependencies.rb
otrzyma const_name 'Builder'
i nesting.inspect => 'nil'
.
Ciekawy że kiedy używam constantize, to rozwiązuje zgodnie z oczekiwaniami:
Loading development environment (Rails 3.2.9)
[1] pry(main)> 'Notification::Builder'.constantize
=> Notification::Builder
(szyny problem na github: https://github.com/rails/rails/issues/8726)
Czy to możliwe, że 'Builder' jest zastrzeżoną nazwą? – tadman
@adadman to nie jest =/ –
czy można go odtworzyć w świeżej aplikacji? Jeśli tak, proszę załóż jeden z nich na github i daj mi znać. Spojrzę na to. Istnieją sytuacje, w których mechanizm ładujący szyny nie będzie w stanie zwrócić prawidłowego wyniku. Myślę, że to powinno być możliwe ... –