Rails引擎的关注点自动加载路径

21

我有一些Rails引擎叫做“Core”,并且我有:

# core/app/models/core/concerns/user_helper.rb
module Core
 module UserHelper
  extend ActiveSupport::Concern
  included do
  # some methods
  end
 end
end

# core/app/models/core/user.rb
module Core
 class User < ActiveRecord::Base
  include Core::UserHelper
 end
end

但是它说未初始化常量Core :: UserHelper。所以似乎引擎默认没有加载它的相关内容,因此我在自动加载路径中添加了它。

module Core
  class Engine < ::Rails::Engine
    config.autoload_paths += %W(#{Core::Engine.root}/app/models/core/concerns)
    isolate_namespace Core
  end
end

现在我遇到了这个错误:无法自动加载常量UserHelper,期望myapp/core/app/models/core/concerns/user_helper.rb来定义它

那么出了什么问题呢?当我查看指南http://edgeguides.rubyonrails.org/engines.html时,它没有在concerns目录下,而是在lib/concerns下,并且所有涉及concern的引用都使用Core::Concerns::MyConcern,在引擎中将concerns放在这里是否正确?

谢谢

编辑

Yury的评论解释了问题,似乎在rails引擎中concerns目录不会得到任何特殊处理,它被视为模型下的普通目录,因此其中的模块必须位于Concerns命名空间内,并且在包含concern时,您也必须使用Concerns命名空间,如果我理解正确。我很惊讶文档中没有提到这一点。


5
我认为这个模块的名字应该是Core::Concerns::UserHelper,它可以留在app/models/concerns目录下。 - Yury Lebedev
似乎这个问题解决了,但又出现了另一个问题,但我不认为这是另一个问题,非常感谢 :) - user1011792
没问题,很高兴能帮忙 :) - Yury Lebedev
2个回答

33

问题必须位于app/models|controllers/concerns/engine_name/concern_name.rb中。 这将自动加载该问题。

要包含问题,请包括EngineName :: ConcernName。


能否加载子类?app/models|controllers/concerns/engine_name/MODEL_NAME/concern_name.rb以实现额外的组织? - Trip
我尝试了那个URL,但似乎无法加载。也许需要增加自动加载配置? - Trip

10

我也遇到了同样的问题。你的错误是把concerns目录放在了app/{models|controllers}/core目录下,其实应该反过来。

你需要改为

app/{models/controllers}/concerns/core/user_helper.rb

我也以为它应该在engine_name目录下,所以花了一些时间才找到正确位置。

希望这个能帮助到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接