5

app/services'da, Notification::Finder ve Notification::Builder gibi bazı sınıflarım var.autoload_paths ad alanının farkında değil misiniz?

app/services/notification/builder.rb ve app/services/notification/finder.rb olarak yerleştirilirler. Ben Finder yüklemeye çalıştığınızda app/models/notification.rb

autoload_path bir model olarak Notification sınıf da vardır

, config.autoload_paths += %W(#{config.root}/app/services)

gibi yapılandırılmışsa, çalışır:

Loading development environment (Rails 3.2.9) 
[1] pry(main)> Notification::Finder 
=> Notification::Finder 

Ama ne zaman Builder'u deniyorum, otomatik yükleme yapan raylarla ilgili bir sorun yaşıyorum:

Loading development environment (Rails 3.2.9) 
[1] pry(main)> Notification::Builder 
=> ActiveRecord::Associations::Builder 

Yalnızca sabit ad (Oluşturucu) zaten diğer ad alanı tarafından tanımlandığında kullanmış olduğum ad alanını yoksayar ve ActiveRecord::Associations::Builder alır.

Bu beklenen davranış mı, yoksa raylar mı? Daha ayrıntılı gidiş

, activesupport/dependencies.rb de const_missing yöntem const_name 'Builder' ve nesting.inspect => 'nil' alır.

Meraklı Ben constantize kullandığınızda, beklendiği gibi gideren:

Loading development environment (Rails 3.2.9) 
[1] pry(main)> 'Notification::Builder'.constantize 
=> Notification::Builder 

(Raylar sorunu github at: https://github.com/rails/rails/issues/8726)

+1

'Builder' ayrılmış bir isim midir? – tadman

+2

@tadman değil =/ –

+1

yeni bir uygulamada çoğaltabilir misiniz? Eğer öyleyse, lütfen bir tane github'a koyun ve bana haber verin. Bir bakacağım. Rayların otomatik yükleyicinin doğru sonucu veremeyeceği durumlar vardır. Sanırım bu mümkün olsa da ... –

cevap

2

ActiveRecord :: Dernekleri :: Builder Rails bir modüldür. Eğer bir Bildirimi varsa :: Oluşturucu, bunu kendi sınıfını sorabilirsiniz:

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

bu beklenen davranış mı?

Evet

Tamam ... ne seçimler var?

  • Sen Builder farklı bir terim kullanabilir. Fabrika gibi. veya Bildirim :: NotificationBuilder

diğer bilgiler: Bir ad olarak bir ActiveRecord modeli kullanılarak, çünkü bu sorun var
* http://www.rubydoc.info/docs/rails/3.1.1/ActiveRecord/Associations/Builder/Association
* http://apidock.com/rails/ActiveRecord/Associations/Builder

1

. Kök sebebini görene kadar bir deneyimle bir gism yarattım.

ActiveRecord modelleri, ActiveRecord::Associations modülünü içerir.Bir modül eklendiğinde bir sabite erişebildiğinizden, Associations içinde tanımlanmış Builder sabitine şimdi de AR modeli ile ulaşılabilir. Bir AR modeline dahil edilmiştir modüllerde tanımlanan her sınıfta, bu davranışı elde edecek:

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] 

Muhtemel bir çözüm, bir ad olarak bir modül kullanmaktır. Örneğin module Notifications.

İlgili konular