ruby-on-rails 如何在Rails中更改初始化器的加载顺序?

kyvafyod  于 2023-04-22  发布在  Ruby
关注(0)|答案(5)|浏览(117)

我有一个初始化器,它从yaml文件加载配置设置。我需要在其他初始化器中使用这些设置。需要它们的初始化器看不到这些设置。我认为发生的情况是设置加载得太晚了。我如何保证我的配置初始化器首先加载?让初始化器依赖于另一个初始化器是否是不正常的?
谢谢!

egdjgwm8

egdjgwm81#

将初始化器重命名为01_name.rb,这将强制它按字母顺序加载。

编辑

引用官方的Rails Guide for configuration(感谢zetetic的提示):
如果你的初始化器中有任何顺序依赖,你可以通过命名来控制加载顺序。例如,01_critical.rb将在02_normal.rb之前加载。

ncecgwcz

ncecgwcz2#

尽管指南建议在初始化器文件名前面加上数字,但这看起来确实很难看。http://guides.rubyonrails.org/configuring.html#initialization-events
例如:

# application.rb

module YourApp
  class Application < Rails::Application
    config.before_initialize do
     # initialization code goes here
    end
  end
end
f0ofjuux

f0ofjuux3#

将配置代码放在config/environment.rb文件中,就在第一个require语句之后,例如:

# Load the rails application
require File.expand_path('../application', __FILE__)

# Load global configurations
CONFIG = Hashie::Mash.new YAML.load_file(Rails.root.join("config", "application.yml"))[Rails.env]

# Initialize the rails application
RailsSetup::Application.initialize!
zynd9foi

zynd9foi4#

使用require_relative确保首先加载一个文件。

# aaa.rb
require_relative 'bbb'
# ... code using values from bbb.rb ...
kiayqfof

kiayqfof5#

我发现最简单的方法是使用config/boot.rb。在之前加载另一个初始化器所需的任何设置都可以在config/boot.rb中加载。
当在初始化器config/initializers/omniauth.rb中调用时,我得到的SysconfigIngestion.config['google_oauth']的值为空。将其转移到 Boot .rb完成了这项工作。

config/ Boot .rb
require 'rubygems'
...

require File.expand_path('config/initializers/sysconfig_loader.rb')
SysconfigLoader.init

require File.expand_path('config/initializers/cipher.rb')

if ENV['DOCKER'] == 'true'
    oauth = SysconfigLoader.config['google_oauth']
    ENV['GOOGLE_CLIENT_ID'] ||= oauth['client_id']
    ENV['GOOGLE_CLIENT_SECRET'] ||= Cipher.decrypt oauth['secret']
end
config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  ## Following did not work
  ## SysconfigLoader.init
  ## oauth = SysconfigLoader.config['google_oauth']
  ## puts oauth['secret'].nil? # true

  ## But boot.rb successfully loaded the required values into ENV variables
  ENV['GOOGLE_CLIENT_SECRET'].nil? ? puts("Missing oauth secret!") : puts("Found oauth secret :)")

  provider :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET'], {}  
end

应用程序在启动时打印Found oauth secret :)!!

相关问题