【问题标题】:Rails mount engine while allowing to subclass any engine classRails 安装引擎,同时允许子类化任何引擎类
【发布时间】: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


【解决方案1】:

由于您需要为一些 Rails 应用程序创建基础以减少样板,我建议您查看Rails Application Templates。使用模板,您可以提供所有必要的脚手架,而无需对任何类进行猴子修补。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多