9

我有两个宝石“CoreGem”和“AddonGem”。Addon Gem 添加了将覆盖核心 gem 的额外功能。

我如何确保如果添加了第二个 gem,它将覆盖第一个 gem 的视图和资产。

到目前为止,它在添加到主应用程序时有效:

 config.railties_order = [ :main_app, AddonGem::Engine, :all]

但我想从 AddonGem 中做到这一点。

谢谢

4

2 回答 2

2

在哪里railties_order使用

railties_order在这里使用:

https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L317

确定initializer要运行的块的顺序,

https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L337

在其他宝石中发现。

https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L47

因此,在块railties_order内进行设置initializer将毫无意义,因为在initializer调用该块时,该块已railties_order被设置并被应用程序的其余部分使用。

你可以做什么

显然initializer,在Rails::Application::Bootstrap.

https://github.com/rails/rails/blob/master/railties/lib/rails/application/bootstrap.rb

这些是在主应用程序的初始化程序块之前添加的:

https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L262

所以也许你可以用一些初始化程序对 Bootstrap 模块进行猴子补丁?我想这是你的电话。

于 2013-11-26T17:49:49.260 回答
-1

制作一个AddonGem注入此代码的生成器

config.railties_order = [ :main_app, AddonGem::Engine, :all]

在主应用程序中,就像一个addongem:install命令。

只是为了完成,虽然这是一个简单的出路。应该可以在某处核心之后挂钩插件。

于 2013-11-26T21:05:29.590 回答