我有两个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;同样的问题。任何人都可以在我做错的地方帮助我吗?
答案 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