【发布时间】:2011-06-14 08:47:30
【问题描述】:
我有一个从 yaml 文件加载配置设置的初始化程序。我需要在其他初始化程序中使用这些设置。需要它们的初始化程序看不到这些设置。我认为正在发生的是设置加载得太晚了。我如何保证我的配置初始化程序首先被加载?让初始化程序依赖于另一个初始化程序是不正常的吗?
谢谢!
【问题讨论】:
标签: ruby-on-rails
我有一个从 yaml 文件加载配置设置的初始化程序。我需要在其他初始化程序中使用这些设置。需要它们的初始化程序看不到这些设置。我认为正在发生的是设置加载得太晚了。我如何保证我的配置初始化程序首先被加载?让初始化程序依赖于另一个初始化程序是不正常的吗?
谢谢!
【问题讨论】:
标签: ruby-on-rails
将初始化程序重命名为01_name.rb,这将强制它以前按字母顺序加载。
编辑
引用官方Rails Guide for configuration(感谢zetetic的提示):
如果您在 您的初始化程序,您可以控制 通过命名加载顺序。例如, 01_critical.rb 将在之前加载 02_normal.rb.
【讨论】:
将配置代码放在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!
【讨论】:
尽管指南建议在初始化程序文件名前加上数字,但这看起来确实很难看。另一种方法是利用提供的初始化挂钩。见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
【讨论】:
使用 require_relative 确保首先加载一个文件。
# aaa.rb
require_relative 'bbb'
# ... code using values from bbb.rb ...
【讨论】:
#use的中间件,中间件将被重新插入。这甚至可能会破坏应用程序。
load 而不是 require 初始化程序...无论如何,-1 因为这会让我失望