【发布时间】:2015-12-23 22:34:12
【问题描述】:
我正在构建一个使用 OmniAuth 的 Rails 引擎。 OmniAuth 需要向 Rails 中间件堆栈添加一些中间件,根据 OmniAuth 的建议,这样做的方法是在初始化程序中进行。我已经尝试过了,我成功地在 gem 中创建了一个初始化程序,它会在 Rails 应用程序启动时加载。现在,我正在尝试向我的 gem 添加一些配置选项,我希望 gem 用户能够在 gem 的初始化程序起作用之前创建另一个初始化程序来配置 gem。
我发现所有引擎中的任何初始化程序都会首先加载。然后接下来加载 Rails 应用程序中的初始化程序。我曾希望我能够以可以控制加载顺序的方式命名初始化程序,但是 Rails 应用程序初始化程序仍然在 gem 的初始化程序之后处理。这对我来说非常有意义,但它给我留下了初始化程序加载顺序问题。 Rails 应用程序将最后运行,所以当它有机会配置 gem 时,gem 已经完成了它的工作。
我的下一个想法是在引擎的 Railtie 中使用 after_initialize 回调。在大多数情况下,这可能会起作用,但在这个特定的用例中它没有帮助。在调用after_initialize 时,中间件堆栈已冻结且无法更改(这使得它对于仅用于更改中间件堆栈的代码毫无用处)。
此时,我只看到一种解决方法。 Rails 应用必须在 application.rb 中配置 gem,以便在运行任何初始化程序之前配置 gem。
有人看到我遗漏的东西吗?有没有办法让 gem 在初始化程序被处理之后(但在 Rails 开始完成启动过程之前)立即做一些工作?如果没有,Rails 似乎有另一个钩子会在处理完初始化程序后立即触发。
【问题讨论】:
-
只是一个疯狂的猜测:也许这有帮助? api.rubyonrails.org/classes/Rails/Railtie/…
-
谢谢,这给了我一个解决方案。我能够使用 app_middleware 钩子。
-
所以你在
before_initialize钩子中使用它——聪明 :) 很高兴它有帮助。
标签: ruby-on-rails ruby-on-rails-4 rails-engines railtie