Rails 4.2无法识别我的模型问题

时间:2015-05-19 05:11:10

标签: ruby-on-rails ruby-on-rails-4 ruby-on-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文件集中在 Concerces 目录中更有意义。如果我有多个对象需要与多个第三方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目录中。我真的不想这样做,它不可维护或可扩展。这是怎么回事?

2 个答案:

答案 0 :(得分:2)

我已决定不再浪费任何富有成效的时间来尝试修复4.2中出色的命名空间问题。核心团队似乎再次“改进”了一项工作。

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

  • 我将我的所有问题从他们的模型子目录中移到了关注的某个级别。

现在一切都恢复了,即使它令人作呕和看起来很糟糕。无论如何,担忧是愚蠢的。只是一种将胖模型放入不同文件的方法。我正在移动此应用程序以使用Trailblazer gem和架构。这将使我免受Rails 5中引入的任何愚蠢的影响,并且是我将来坚持使用该平台的唯一方法。

答案 1 :(得分:0)

我能够通过将我的命名空间问题从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