Rails引擎涉及自动加载路径

时间:2015-06-25 13:54:51

标签: ruby-on-rails rails-engines

我有一些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并且它没有关注目录中的问题,而是在lib /关注下并且所有引用关注使用Core :: Concerns :: MyConcern时,这也是关注的地方在发动机?

由于

修改

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

2 个答案:

答案 0 :(得分:21)

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

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

答案 1 :(得分:0)

我有同样的问题。您的错误是您将var deviceCache : ConcurrentHashMap<String, Device> by MyObservable(ConcurrentHashMap()) class MyObservable<T, V>(initialValue: ConcurrentHashMap<T, V>) : ObservableProperty<ConcurrentHashMap<T, V>>(initialValue) { override fun afterChange(property: KProperty<*>, oldValue: ConcurrentHashMap<T, V>, newValue: ConcurrentHashMap<T, V>) { super.afterChange(property, oldValue, newValue) log.e("new value is $newValue") } override fun beforeChange(property: KProperty<*>, oldValue: ConcurrentHashMap<T, V>, newValue: ConcurrentHashMap<T, V>): Boolean { log.e("beforeChange called") return super.beforeChange(property, oldValue, newValue) } 目录放到concerns目录中,而应该相反。

代替做

app/{models|controllers}/core

更改为

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

我花了点时间才弄清楚,因为我凭直觉认为它也应该在app/{models/controllers}/concerns/core/user_helper.rb目录下。

希望这会有所帮助。