我们有一个问题,我们想要用作我们的用户类的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 /关注它说它无法在那里找到它。太令人沮丧了。
答案 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自动加载问题。
感谢您的回答!