我有一个初始化器,它从yaml文件加载配置设置。我需要在其他初始化器中使用这些设置。需要它们的初始化器看不到这些设置。我认为发生的情况是设置加载得太晚了。我如何保证我的配置初始化器首先加载?让初始化器依赖于另一个初始化器是否是不正常的?谢谢!
egdjgwm81#
将初始化器重命名为01_name.rb,这将强制它按字母顺序加载。
01_name.rb
编辑
引用官方的Rails Guide for configuration(感谢zetetic的提示):如果你的初始化器中有任何顺序依赖,你可以通过命名来控制加载顺序。例如,01_critical.rb将在02_normal.rb之前加载。
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
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!
zynd9foi4#
使用require_relative确保首先加载一个文件。
# aaa.rb require_relative 'bbb' # ... code using values from bbb.rb ...
kiayqfof5#
我发现最简单的方法是使用config/boot.rb。在之前加载另一个初始化器所需的任何设置都可以在config/boot.rb中加载。当在初始化器config/initializers/omniauth.rb中调用时,我得到的SysconfigIngestion.config['google_oauth']的值为空。将其转移到 Boot .rb完成了这项工作。
config/boot.rb
config/initializers/omniauth.rb
SysconfigIngestion.config['google_oauth']
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
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 :)!!
Found oauth secret :)
5条答案
按热度按时间egdjgwm81#
将初始化器重命名为
01_name.rb
,这将强制它按字母顺序加载。编辑
引用官方的Rails Guide for configuration(感谢zetetic的提示):
如果你的初始化器中有任何顺序依赖,你可以通过命名来控制加载顺序。例如,01_critical.rb将在02_normal.rb之前加载。
ncecgwcz2#
尽管指南建议在初始化器文件名前面加上数字,但这看起来确实很难看。http://guides.rubyonrails.org/configuring.html#initialization-events
例如:
f0ofjuux3#
将配置代码放在config/environment.rb文件中,就在第一个require语句之后,例如:
zynd9foi4#
使用require_relative确保首先加载一个文件。
kiayqfof5#
我发现最简单的方法是使用
config/boot.rb
。在之前加载另一个初始化器所需的任何设置都可以在config/boot.rb
中加载。当在初始化器
config/initializers/omniauth.rb
中调用时,我得到的SysconfigIngestion.config['google_oauth']
的值为空。将其转移到 Boot .rb完成了这项工作。config/ Boot .rb
config/initializers/omniauth.rb
应用程序在启动时打印
Found oauth secret :)
!!