如何从gem端强制生效JSONAPI.configure配置以覆盖Rails应用配置?
解决方案
要让gem的maximum_page_size配置优先生效,核心思路是在Rails应用完成所有初始化器加载后,重新覆盖配置值。以下是具体实现方案:
方法:使用Rails的to_prepare回调
Rails的to_prepare回调会在以下时机执行:
- 生产环境:应用启动时,在所有初始化器执行完毕后运行
- 开发环境:应用启动时,以及每次代码重新加载后运行
这个特性刚好能让我们在应用自身的初始化器修改配置后,再把gem的配置值设置回去。
修改你的gem初始化文件config/initializers/jsonapi-resources_initializer.rb如下:
require 'jsonapi-resources' require 'jsonapi/exceptions/access_denied' require 'jsonapi/exceptions/unauthorized' # 初始设置配置 JSONAPI.configure do |config| config.maximum_page_size = 100 end # 注册回调,确保在应用初始化后覆盖配置 if defined?(Rails) Rails.application.config.to_prepare do JSONAPI.configure do |config| config.maximum_page_size = 100 end end end
为什么这个方案有效?
Rails的加载顺序是:
- 加载gem的初始化器(此时设置
maximum_page_size=100) - 加载应用自身的初始化器(此时被覆盖为
1000) - 执行
to_prepare回调(再次设置为100,最终生效)
开发环境下每次代码重载后,to_prepare会重新执行,确保配置不会被应用的初始化器再次覆盖。
为什么after_initialize效果不佳?
after_initialize只在应用启动时执行一次,开发环境下代码重新加载后不会再次运行,此时应用的初始化器会再次加载并覆盖配置,导致gem的设置失效。而to_prepare完美解决了这个问题。
内容的提问来源于stack exchange,提问作者Anton-Ivanov
相关产品推荐
相关产品推荐

