【问题标题】:Rails engine concerns autoload pathsRails 引擎关注自动加载路径
【发布时间】:2015-09-12 04:22:40
【问题描述】:

我有一些 Rails 引擎“核心”,我有:

# 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 时,它没有关注目录中的问题,而是在 lib/concerns 下,并且使用 Core::Concerns::MyConcern 引用了所有关注点,所以这是在引擎中放置关注点的地方?

谢谢

编辑

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

【问题讨论】:

  • 我觉得模块应该命名为Core::Concerns::UserHelper,可以留在app/models/concerns目录下
  • 似乎这解决了问题,提出了另一个问题,但我不认为这是另一个问题,非常感谢:)
  • 没问题,很高兴为您提供帮助:)

标签: ruby-on-rails rails-engines


【解决方案1】:

关注点必须位于 app/models|controllers/concerns/engine_name/concern_name.rb 中。这将自动加载关注点。

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

【讨论】:

  • 是否可以加载子类? app/models|controllers/concerns/engine_name/MODEL_NAME/concern_name.rb 进行额外组织?
  • 我尝试了那个 URL,但它似乎没有加载它。也许必须增加自动加载配置?
【解决方案2】:

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

而不是做

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

改成

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

我有点想通了,因为我直觉认为它也应该在engine_name目录下。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-03-14
    • 2014-08-22
    • 2010-12-24
    • 1970-01-01
    • 2013-12-08
    • 2016-09-19
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多