版本有多大区别!在我的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
这是一个愚蠢和误导性的错误。这个问题只有一个简单的方法。没有任何循环的可能性。
现在我被卡住了。我唯一的选择是重命名我的所有文件并将它们放入Concer目录中。我真的不想这样做,它不可维护或可扩展。这里发生了什么?
我决定不再浪费任何富有成效的时间来试图修复我在4.2中出色的命名空间问题。核心团队似乎再次“改进”了一项工作。
include
d。并相应地更改了模块名称。现在一切都恢复了,即使它令人作呕和看起来很糟糕。无论如何,担忧是愚蠢的。只是一种将胖模型放入不同文件的方法。我正在移动这个应用程序使用Trailblazer宝石和架构。这将使我免受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