5

Trong app/services, tôi có một số lớp học, như Notification::FinderNotification::Builder.autoload_paths không nhận biết được không gian tên?

Chúng được đặt là app/services/notification/builder.rbapp/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)

+1

Có thể 'Builder' là tên dành riêng không? – tadman

+2

@tadman nó không phải là =/ –

+1

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ù ... –

Trả lời

2

ActiveRecord :: Hội :: Builder là một mô-đun trong Rails. Nếu bạn có một thông báo :: Builder, bạn có thể yêu cầu nó lớp của nó:

>> Notification::Builder 
=> ActiveRecord::Associations::Builder 
>> Notification::Builder.class 
=> Module 
>> Notification::Builder.ancestors 
=> [ActiveRecord::Associations::Builder] 

là hành vi mong đợi này?

OK, vì vậy ... những gì lựa chọn nào bạn có?

  • Bạn có thể sử dụng cụm từ khác với Trình tạo. Giống như nhà máy. hoặc thông báo :: NotificationBuilder

Thông tin thêm:
* http://www.rubydoc.info/docs/rails/3.1.1/ActiveRecord/Associations/Builder/Association
* http://apidock.com/rails/ActiveRecord/Associations/Builder

1

vấn đề này tồn tại vì bạn đang sử dụng một mô hình ActiveRecord như một không gian tên. Tôi tạo ra một ý chính với một số thử nghiệm cho đến khi tôi thấy nguyên nhân gốc rễ.

ActiveRecord mô hình bao gồm mô-đun ActiveRecord::Associations.Vì bạn có thể nhận được một hằng số khi bao gồm một mô-đun, hằng số Builder được xác định trong vòng Associations giờ đây cũng có thể truy cập thông qua mô hình AR. Bạn sẽ nhận được hành vi này với tất cả các lớp được định nghĩa trong module, được đưa vào một mô hình AR:

1.9.3-p194 :010 > Post.ancestors 
=> [Post(id: integer, title: string, published_at: datetime, created_at: datetime, updated_at: datetime), Post::GeneratedFeatureMethods, #<Module:0x007fec74dc33a0>, ActiveRecord::Base, ActiveRecord::Core, ActiveRecord::Store, ActiveRecord::Serialization, ActiveModel::Serializers::Xml, ActiveModel::Serializers::JSON, ActiveModel::Serialization, ActiveRecord::Reflection, ActiveRecord::Transactions, ActiveRecord::Aggregations, ActiveRecord::NestedAttributes, ActiveRecord::AutosaveAssociation, ActiveModel::SecurePassword, ActiveRecord::Associations, ActiveRecord::Timestamp, ActiveModel::Validations::Callbacks, ActiveRecord::Callbacks, ActiveRecord::AttributeMethods::Serialization, ActiveRecord::AttributeMethods::Dirty, ActiveModel::Dirty, ActiveRecord::AttributeMethods::TimeZoneConversion, ActiveRecord::AttributeMethods::PrimaryKey, ActiveRecord::AttributeMethods::Query, ActiveRecord::AttributeMethods::BeforeTypeCast, ActiveRecord::AttributeMethods::Write, ActiveRecord::AttributeMethods::Read, ActiveRecord::AttributeMethods, ActiveModel::AttributeMethods, ActiveRecord::Locking::Pessimistic, ActiveRecord::Locking::Optimistic, ActiveRecord::CounterCache, ActiveRecord::Validations, ActiveModel::Validations::HelperMethods, ActiveSupport::Callbacks, ActiveModel::Validations, ActiveRecord::Integration, ActiveModel::Conversion, ActiveRecord::AttributeAssignment, ActiveModel::ForbiddenAttributesProtection, ActiveModel::DeprecatedMassAssignmentSecurity, ActiveRecord::Sanitization, ActiveRecord::Scoping::Named, ActiveRecord::Scoping::Default, ActiveRecord::Scoping, ActiveRecord::Inheritance, ActiveRecord::ModelSchema, ActiveRecord::ReadonlyAttributes, ActiveRecord::Persistence, Object, PP::ObjectMixin, ActiveSupport::Dependencies::Loadable, V8::Conversion::Object, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject] 

Một giải pháp khả thi là sử dụng một mô-đun như một không gian tên. Ví dụ: module Notifications.

Các vấn đề liên quan