如何更改其中一个宝石中加载宝石的顺序

时间:2013-08-15 20:22:38

标签: ruby-on-rails ruby-on-rails-4

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

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

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

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

但是我想在AddonGem中做到这一点。

由于

2 个答案:

答案 0 :(得分: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模块?我猜这是你的电话。

答案 1 :(得分:-1)

AddonGem中创建一个注入此代码的生成器

config.railties_order = [ :main_app, AddonGem::Engine, :all]
主应用程序中的

,如addongem:install命令。

只是为了完成,虽然这是一个简单的方法。应该可以将插件挂在核心的某处。