Rails引擎涉及自动加载路径

16 ruby-on-rails rails-engines

我有一些导轨引擎'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
Run Code Online (Sandbox Code Playgroud)

但它表示未初始化的常量Core :: UserHelper.因此,默认情况下引擎似乎没有加载其关注点,因此我将其添加到自动加载路径中

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

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

那么这里有什么问题?当我检查指南http://edgeguides.rubyonrails.org/engines.html并且它没有关注目录中的问题,而是在lib /关注下并且所有引用关注使用Core :: Concerns :: MyConcern那么这引起了引擎关注的问题呢?

谢谢

编辑

Yury评论解释了这个问题,似乎在rails引擎关注目录中没有得到任何特殊处理,并且它被视为模型下的普通目录,因此其中的模块必须在Concerns命名空间内,并且当包含关注时,你如果我理解的话,也必须将其包含在Concerns namesapace中.我很惊讶这在文档中没有提到.

小智 25

问题必须存在于app/models | controllers/concerns/engine_name/concern_name.rb中.这将自动加载关注.

要包含关注点,请包含EngineName :: ConcernName.


The*_*dis 6

我遇到过同样的问题。你的错误是你把concerns目录放在app/{models|controllers}/core目录中,而它应该是相反的。

而不是做

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

把它改成

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

我花了一点时间才弄清楚,因为我直觉地认为它也应该在engine_name目录下。

希望这可以帮助。