我有一些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中。我很惊讶文档中没有提到这一点。答案 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
目录下。
希望这会有所帮助。