5

app/services,我有一些類,如Notification::FinderNotification::Builderautoload_paths不知道命名空間?

它們被放置爲app/services/notification/builder.rbapp/services/notification/finder.rb

也有Notification類爲模型,在app/models/notification.rb

的autoload_path當我嘗試加載Finder經過配置爲config.autoload_paths += %W(#{config.root}/app/services)

,它的工作原理:

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

但是,當我嘗試了Builder,我在導軌自動加載時遇到問題:

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

它只是忽略了常量名稱(Builder)已被其他名稱空間定義並使用ActiveRecord::Associations::Builder代替時所使用的名稱空間。

這是預期的行爲,還是一個rails bug?

去更詳細的,在activesupport/dependencies.rbconst_missing方法接收const_name 'Builder',和nesting.inspect => 'nil'

奇怪的是,當我使用constantize,它如預期解析:

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

(Rails的問題在github上:https://github.com/rails/rails/issues/8726

+1

「Builder」是一個保留名稱嗎? – tadman

+2

@tadman它不是=/ –

+1

你可以在新的應用程序中重現它嗎?如果是這樣,請將其中一個放在github上並讓我知道。我會看一看。有些情況下導軌自動加載器將無法返回正確的結果。我認爲這應該是可能的,雖然... –

回答

2

的ActiveRecord ::協會:: Builder是Rails中的模塊。如果你有一個通知::生成器,你可以問它的類:

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

這是預期的行爲?

OK,所以......你有什麼選擇呢?

  • 您可以使用與Builder不同的術語。像工廠一樣。或通知:: NotificationBuilder

更多信息:
* http://www.rubydoc.info/docs/rails/3.1.1/ActiveRecord/Associations/Builder/Association
* http://apidock.com/rails/ActiveRecord/Associations/Builder

1

,因爲你正在使用ActiveRecord模型爲命名空間中存在此問題。我用一些實驗創造了一個要點,直到我看到根本原因。

ActiveRecord型號包括ActiveRecord::Associations模塊。由於在包含模塊時可以達到常數,因此Associations中定義的Builder常量現在也可通過AR模型到達。你會得到這種行爲與該模塊中定義的每一個類,其中包括爲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] 

一個可能的解決方案是使用一個模塊作爲一個命名空間。例如module Notifications