Rails 4.2将无法识别我的模型关注点



一个版本有多么不同啊!在我的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文件集中在关注点目录中要有意义得多。如果我有多个对象需要与多个第三方api交互,那么这是最好的方法。

但是将这个应用程序升级到Rails 4.2,它拒绝工作。我收到了很多,很多,很多关于这些问题的投诉:

Unable to autoload constant Category::ThirdPartyA

它"期望文件定义它"之类的。文件看起来像这样:

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中出色的命名空间问题。核心团队似乎又一次"改进"了约定的一个工作部分。

  • 我在所有关注的文件名前加上每个include d的模型名称,并相应地更改模块名称

  • 我将我所有的关注点从它们的模型子目录向上移动到关注点

现在一切都恢复正常了,尽管看起来很恶心。担心是愚蠢的。只是一种把胖模型放进不同文件的方法。我要把这个应用改成使用开拓者的宝石和架构。这将使我免受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

最新更新