Rails 4.2 无法识别我的模型问题
Rails 4.2 will not recognize my model concerns
一个版本有多么不同!在我的 Rails 3.2 应用程序中,我使用了关注点,它们的设置如下:
--app
--models
category.rb
product.rb
--concerns
--category
third_party_a.rb
third_party_b.rb
--product
third_party_a.rb
third_party_b.rb
--warehouse
third_party_a.rb
third_party_b.rb
我对同名的命名空间到不同的目录感到担忧。这就是我被教导这样做的方式,它比 Rails 4.2 默认将一堆 Ruby 文件集中在 concerns 中更有意义目录。如果我有多个对象需要与多个第三方 API 进行交互,那么这是最好的方法。
但是将此应用程序升级到 Rails 4.2,嗯,它拒绝工作。我收到了很多很多关于这些问题的投诉:
Unable to autoload constant Category::ThirdPartyA
它 "expected the file to define it" 之类的。该文件如下所示:
module EbayInteraction
extend ActiveSupport::Concern
module ClassMethods
...
不,那里没有其他命名空间。但是 Rails 3.2 不需要它。它完美地工作。
所以我进入文件并将声明更改为:
module Category::ThirdPartyA
我不知道这是否正确。我对模块和命名空间很困惑,这两个概念对我来说都没有任何意义。
然后我进入模型本身,include
关注点如下:
include Category::ThirdPartyA
我克服了错误。然后抱怨 ThirdPartyB,所以我也这样做。等等。
完成后,我现在收到以下投诉:
Circular dependency detected while autoloading constant Category::ThirdPartyA
这是一个愚蠢且具有误导性的错误。这种担忧只有一种微不足道的方法。不可能有任何循环。
现在我卡住了。我唯一的选择是重命名我的所有文件并将它们集中到关注目录中。我真的不想那样做,它不可维护或可扩展。这是怎么回事?
我决定不再浪费任何有效时间来尝试解决我在 4.2 中的出色命名空间问题。核心团队似乎再次 "improved" 一个工作惯例。
我在所有关注文件名前加上模型名称,其中每个文件名都是 include
d。并相应地更改了模块名称。
我将我所有的问题从他们的模型子目录中移到了 concerns.
现在一切都恢复正常了,尽管它很恶心而且看起来很恶心。无论如何,担忧都是愚蠢的。只是将胖模型内容放入不同文件的一种方法。我正在移动此应用程序以使用 Trailblazer gem 和体系结构。这将使我免受 Rails 5 中引入的任何愚蠢行为的影响,并且是我将来坚持使用该平台的唯一方法。
我已经能够通过将我的命名空间问题移出 concerns
目录来完成此操作。
# app/models/model_one.rb
class ModelOne < ActiveRecord::Base
include Helpers
end
# app/models/model_one/helpers.rb
class ModelOne
module Helpers
extend ActiveSupport::Concern
def some_method
# do stuff
end
end
end
一个版本有多么不同!在我的 Rails 3.2 应用程序中,我使用了关注点,它们的设置如下:
--app
--models
category.rb
product.rb
--concerns
--category
third_party_a.rb
third_party_b.rb
--product
third_party_a.rb
third_party_b.rb
--warehouse
third_party_a.rb
third_party_b.rb
我对同名的命名空间到不同的目录感到担忧。这就是我被教导这样做的方式,它比 Rails 4.2 默认将一堆 Ruby 文件集中在 concerns 中更有意义目录。如果我有多个对象需要与多个第三方 API 进行交互,那么这是最好的方法。
但是将此应用程序升级到 Rails 4.2,嗯,它拒绝工作。我收到了很多很多关于这些问题的投诉:
Unable to autoload constant Category::ThirdPartyA
它 "expected the file to define it" 之类的。该文件如下所示:
module EbayInteraction
extend ActiveSupport::Concern
module ClassMethods
...
不,那里没有其他命名空间。但是 Rails 3.2 不需要它。它完美地工作。
所以我进入文件并将声明更改为:
module Category::ThirdPartyA
我不知道这是否正确。我对模块和命名空间很困惑,这两个概念对我来说都没有任何意义。
然后我进入模型本身,include
关注点如下:
include Category::ThirdPartyA
我克服了错误。然后抱怨 ThirdPartyB,所以我也这样做。等等。
完成后,我现在收到以下投诉:
Circular dependency detected while autoloading constant Category::ThirdPartyA
这是一个愚蠢且具有误导性的错误。这种担忧只有一种微不足道的方法。不可能有任何循环。
现在我卡住了。我唯一的选择是重命名我的所有文件并将它们集中到关注目录中。我真的不想那样做,它不可维护或可扩展。这是怎么回事?
我决定不再浪费任何有效时间来尝试解决我在 4.2 中的出色命名空间问题。核心团队似乎再次 "improved" 一个工作惯例。
我在所有关注文件名前加上模型名称,其中每个文件名都是
include
d。并相应地更改了模块名称。我将我所有的问题从他们的模型子目录中移到了 concerns.
现在一切都恢复正常了,尽管它很恶心而且看起来很恶心。无论如何,担忧都是愚蠢的。只是将胖模型内容放入不同文件的一种方法。我正在移动此应用程序以使用 Trailblazer gem 和体系结构。这将使我免受 Rails 5 中引入的任何愚蠢行为的影响,并且是我将来坚持使用该平台的唯一方法。
我已经能够通过将我的命名空间问题移出 concerns
目录来完成此操作。
# app/models/model_one.rb
class ModelOne < ActiveRecord::Base
include Helpers
end
# app/models/model_one/helpers.rb
class ModelOne
module Helpers
extend ActiveSupport::Concern
def some_method
# do stuff
end
end
end