2016-03-28 10 views
1

私たちはUserクラスのミックスインとして使用したいと考えています。この懸念は、当社が複数の製品に使用している当社の別個のレールエンジンにあります。モジュール内にネストされた懸念を使用する

このエンジンのすべては、私たちが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を削除して、ユーザーにインクルードすると、うまくいきます。

私はレールがオートローディングをしていることは知っていますが、なぜこれは動作しませんか?それはファイルがクラスを持っていることを知っています...もし私がエンジン/アプリケーション/懸念にそれを移動すると、それはそこにそれを見つけることができないと言います。だからイライラする。

答えて

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]} 

:私はちょうどラインを使用しました。

ありがとうございます!

関連する問題