【发布时间】:2015-06-05 21:07:15
【问题描述】:
我正在 Rails 中构建一个平台,它将作为其他几个 Rails 应用程序的基础。理想情况下,我希望这是一个共享引擎,其他具体应用程序可以在其上构建。
如果应用程序可以扩展引擎提供的基类,那就太好了。 AFAIK 这可以使用猴子补丁来完成,但这对我来说感觉很“骇人听闻”。
我偶然发现了一个看起来像解决方案的方法,它只是在 Rails 主应用程序中创建“镜像”类,它扩展了引擎的类:
# SharedEngine/models/shared_engine/post.rb
module SharedEngine
class Post < ActiveRecord::Base
def hello
"Hello"
end
end
end
# App/models/shared_engine/post.rb
require SharedEngine::Engine.root.join('app', 'models', 'shared_engine', 'post')
class Post < SharedEngine::Post
def hello
super + " world"
end
end
但是,似乎存在一些自动加载问题。服务器启动后,它会打印“Hello”。然后在我保存应用模型后,它会显示“Hello world”。
Rails 引擎指南suggests putting shared code into concerns。有没有其他方法可以让这个工作干净利落,而不必为每个类创建问题?
【问题讨论】:
-
类重新加载只会在开发环境中发生,大多数自动加载问题可以使用:Rails::Railtie::Configurartion#to_prepare 绕过。虽然这不是处理它的建议方法。请参阅下面的答案。
标签: ruby ruby-on-rails-4 rails-engines