【问题标题】:autoload_paths not aware of namespace?autoload_paths 不知道命名空间?
【发布时间】:2013-01-03 16:48:38
【问题描述】:

app/services,我有一些课程,如Notification::FinderNotification::Builder

它们被放置为app/services/notification/builder.rbapp/services/notification/finder.rb

还有Notification 类作为模型,在app/models/notification.rb

autoload_path 配置为config.autoload_paths += %W(#{config.root}/app/services)

当我尝试加载 Finder 时,它可以工作:

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

但是当我尝试Builder 时,我遇到了rails 自动加载的问题:

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

当常量名称(Builder)已经被其他命名空间定义时,它只是忽略我使用的命名空间,并获取ActiveRecord::Associations::Builder

这是预期的行为,还是 Rails 错误?

更详细地说,activesupport/dependencies.rb 处的 const_missing 方法接收到 const_name 'Builder'nesting.inspect => 'nil'

很好奇,当我使用 constantize 时,它​​会按预期解决:

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

(github 上的 Rails 问题:https://github.com/rails/rails/issues/8726

【问题讨论】:

  • Builder 可能是保留名称吗?
  • 你能在一个新的应用程序中重现它吗?如果是这样,请在 github 上发布一个并让我知道。我会看看。在某些情况下,rails 自动加载器将无法返回正确的结果。我认为这应该是可能的......
  • @YvesSenn,感谢您的帮助:D 我在这里放了一个更简单的错误版本:github.com/rodrigues/autoload_zomg

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 ruby-1.9.3


【解决方案1】:

ActiveRecord::Associations::Builder 是 Rails 中的一个模块。如果你有一个 Notification::Builder,你可以问它的类:

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

这是预期的行为吗?

是的

好的,那么...你有什么选择?

  • 您可以使用与 Builder 不同的术语。像工厂。或 Notification::NotificationBuilder

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

【讨论】:

    【解决方案2】:

    存在此问题是因为您将 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2011-08-26
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多