无法在rails中的其他类中加载类 - TypeError:不是模块

时间:2018-04-13 07:35:46

标签: ruby-on-rails ruby

  

我有两个rails应用程序,在第一个应用程序内部我定义了所有业务逻辑并使用" gem"在另一个。当我在其他rails应用程序中打开类添加一些方法时,它没有加载它给" TypeError:餐厅不是模块" 代码如下:

应用程序/模型/发票/餐厅/ searchable.rb

module Invoices
  module Restaurant
    module Searchable
      extend ActiveSupport::Concern
      included do
        include Elasticsearch::Model
        index_name "restaurant-invoices-#{Rails.env}"
      end
    end
  end
end

# force load
Restaurant::Invoice.ancestors

module Restaurant
  class Invoice
    include ::Invoices::Restaurant::Searchable
  end
end

其他Rails应用程序中的Invoice类:

  

应用程序/模型/餐厅/ invoice.rb

class Restaurant::Invoice < ActiveRecord::Base
   // here all business logic
end
  

当我运行发票::餐馆::可搜索时,它会抛出错误&#34; TypeError:餐厅不是模块&#34; 我认为这是&#34;模块餐厅的一个问题&#34;所以我把它的名字更改为&#34;模块餐厅1&#34;然后运行&#34; 发票:: Restaurant1 :: Searchable &#34;同样的问题。任何人都可以在我做错的地方帮助我吗?

2 个答案:

答案 0 :(得分:0)

定义类时,不应该使用速记。我认为以下代码将 Restaurant 定义为一个类:

class Restaurant::Invoice < ActiveRecord::Base
  # here all business logic
end

如果首先加载此代码,Ruby应该知道 Restaurant 是一个类还是模块? Rails自动加载会创建缺少的类和模块。这很可能是你的问题。请参阅:Autoloading and Reloading Constants - Common Gotchas

仅使用::引用类,而不是创建它们。您也可以在Ruby style guide中找到此信息。将上面的代码更改为:

module Restaurant
  class Invoice < ActiveRecord::Base
    # here all business logic
  end
end

这可能会解决您的问题。

答案 1 :(得分:0)

  

我已通过添加以下代码解决了这个问题:

class Restaurant::Invoice
  include ::Invoices::Restaurant::Searchable
end