使用嵌套在模块中的关注点

时间:2016-03-28 21:07:39

标签: ruby-on-rails ruby rails-engines

我们有一个问题,我们想要用作我们的用户类的mixin。在我们用于多种产品的单独导轨引擎中可以找到这种担忧。

此引擎中的所有内容,我们都保持在同一个模块中,我们称之为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&#39;:

     

无法自动加载常量EngineUser,   预期   /Users/foo/Perforce/engine_folder/app/models/concerns/engine_user.rb   定义它

哪个.....是正确的文件......&lt;。&lt;

如果我删除了课程周围的module MyEngine,并在用户中形成了包含,那就可以了。

我知道rails在幕后自动加载,但为什么这不起作用?它知道该文件有类...如果我将它移动到引擎/ app /关注它说它无法在那里找到它。太令人沮丧了。

2 个答案:

答案 0 :(得分:2)

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

看一下我添加的附加模块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帖子。

答案 1 :(得分:0)

所以Justin Licata的回答可能是“正确的”答案,但我最终得到的解决方案如下:

engine_folder/lib/my_engine.rb中,这是加载引擎的一部分,我只是使用了这一行:

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

我承认,它肯定有一些气味,但它让我们遵循自己的约定和结构,并允许我们根据需要添加文件夹层次结构,而不必担心rails自动加载问题。

感谢您的回答!