Trong app/services
, tôi có một số lớp học, như Notification::Finder
và Notification::Builder
.autoload_paths không nhận biết được không gian tên?
Chúng được đặt là app/services/notification/builder.rb
và app/services/notification/finder.rb
.
Ngoài ra còn có các lớp Notification
như một mô hình, tại app/models/notification.rb
Các autoload_path được configurated như trong config.autoload_paths += %W(#{config.root}/app/services)
Khi tôi cố gắng để tải Finder
, nó hoạt động:
Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Finder
=> Notification::Finder
Nhưng khi Tôi thử số Builder
, tôi gặp sự cố với tự động tải đường ray:
Loading development environment (Rails 3.2.9)
[1] pry(main)> Notification::Builder
=> ActiveRecord::Associations::Builder
Nó chỉ bỏ qua không gian tên mà tôi đã sử dụng khi tên hằng (Builder) đã được xác định bởi không gian tên khác và thay vào đó là ActiveRecord::Associations::Builder
.
Đây có phải là hành vi mong đợi hoặc lỗi đường ray không?
Đi chi tiết hơn, phương pháp const_missing
tại activesupport/dependencies.rb
nhận const_name 'Builder'
, và nesting.inspect => 'nil'
.
Tò mò rằng khi tôi sử dụng constantize, nó giải quyết như mong đợi:
Loading development environment (Rails 3.2.9)
[1] pry(main)> 'Notification::Builder'.constantize
=> Notification::Builder
(Rails vấn đề tại github: https://github.com/rails/rails/issues/8726)
Có thể 'Builder' là tên dành riêng không? – tadman
@tadman nó không phải là =/ –
bạn có thể tái tạo nó trong một ứng dụng mới? Nếu vậy, xin vui lòng đặt một trên github và cho tôi biết. Tôi sẽ xem qua một chút. Có những tình huống mà trình tự động tải đường ray sẽ không thể trả lại kết quả phù hợp. Tôi nghĩ rằng điều này nên có thể mặc dù ... –