2016-03-28 62 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]} 

的確具有一定的氣味,我承認,但它讓我們按照我們自己的約定和結構,使我們能夠根據需要添加文件夾層次結構,而不必擔心導軌自動加載問題。

感謝您的答案!