2016-03-28 130 views
1

我们有一个担心,我们想用作用户类的混合。这个问题可以在我们用于多种产品的单独导轨引擎中找到。在模块中使用关注嵌套

在这个引擎中的一切,我们保持在同一个模块中,我们将称之为MyEngine。

module MyEngine 
    module EngineUser 
    extend ActiveSupport::Concern 
    end 
end 

而且我们特林包括像我们的Rails应用程序的任何其他关注:

class User < ActiveRecord::Base 
    include MyEngine::EngineUser 
    # ... 
end 

这将导致在那里说了一个错误:(格式化有的为可读性)

/Users/foo/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:495:in'load_missing_constant':

无法自动加载不断EngineUser, 预计 /Users/foo/Perforce/engine_folder/app/models/concerns/engine_user.rb 来定义它

这.....是正确的文件.. 。<。 <

如果我删除围绕类的module MyEngine,并在User中形成include,那么它工作得很好。

我知道rails在后台自动加载,但为什么不能正常工作?它知道该文件有类...如果我将它移动到引擎/应用程序/它担心它说它无法在那里找到它。太令人沮丧了。

回答

1

这应该可以解决您的问题。我最近有同样的问题..

看看额外的模块,Concerns,我已经添加了。

module MyEngine 
    module Concerns 
    module EngineUser 
     extend ActiveSupport::Concern 
    end 
    end 
end 

# lib/my_engine/engine.rb 
module MyEngine 
    class Engine < ::Rails::Engine 
    config.autoload_paths += %W(#{MyEngine::Engine.root}/app/models/my_engine/concerns/engine_user.rb) 
    isolate_namespace MyEngine 
    end 
end 

# app/models/user.rb 
class User < ActiveRecord::Base 
    include MyEngine::Concerns::EngineUser 
    # ... 
end 

这里是RailsGuide后,导致我的答案。

+0

所以我认为这可行,但我最终选择了另一种解决方案,我将很快发布。 谢谢,虽然! – Avaista

0

所以从贾斯汀·利卡塔答案很可能是“正确”的答案,但我最终的解决方案要与结果如下:

engine_folder/lib/my_engine.rb,这是包括装载的是引擎的一部分,我只是用线:

Dir[File.dirname(__FILE__) + "/my_engine/concerns/**/*.rb"].each { |file| require file[0..-4]} 

的确具有一定的气味,我承认,但它让我们按照我们自己的约定和结构,使我们能够根据需要添加文件夹层次结构,而不必担心导轨自动加载问题。

感谢您的答案!