如何在Rails 3中更改初始值设定项的加载顺序?

Tim*_*ord 60 ruby-on-rails ruby-on-rails-3

我有一个初始化程序,可以从yaml文件加载配置设置.我需要在其他初始化程序中使用这些设置.需要它们的初始化程序不会看到这些设置.我认为正在发生的是设置加载得太迟了.如何保证我的配置初始化程序首先被加载?是不是让像初始化者依赖另一个?

谢谢!

Júl*_*tos 80

将初始化程序重命名为01_name.rb,将强制它先前按字母顺序加载.

编辑

引用官方Rails指南进行配置(感谢zetetic的提示):

如果初始化程序中有任何排序依赖项,则可以通过命名来控制加载顺序.例如,01_critical.rb将在02_normal.rb之前加载.

  • 虽然这可行,但它似乎是一个丑陋的解决方法. (52认同)
  • 这是"配置Rails应用程序"指南中建议的技术:http://guides.rubyonrails.org/configuring.html (7认同)
  • 这个答案写于2011年.在(2015年初),似乎这种行为仍然有效.我的结论是,这是一种*稳定,可靠的方法来实现这一结果.+1 (3认同)
  • @IssacBetesh这是一个"丑陋"的解决方案,因为如果你必须编辑它们,它会在不必要的工作上造成很大的影响.假设你有25个文件,然后添加一个需要先运行的文件.你使新的01,并不得不碰少其他文件的数量.或者您可以将其命名为001或0001等.config.before_initialize解决方案要好得多. (2认同)

Tyl*_*ong 25

将配置代码放在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!
Run Code Online (Sandbox Code Playgroud)


小智 24

尽管指南建议在初始化文件名​​前加上数字,但这看起来确实很难看.另一种方法是利用提供的初始化钩子.请参阅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
Run Code Online (Sandbox Code Playgroud)


小智 6

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

# aaa.rb
require_relative 'bbb'
# ... code using values from bbb.rb ...
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,但除了在需要时运行所需的文件之外,Rails将*再次*运行文件,通常是在正常运行初始化程序的过程中(实际上,按照它们出现在目录中的顺序)清单).因此,您需要确保您要求的文件不会执行任何您不希望多次运行的操作.例如,如果所需文件初始化常量,Rails会警告您正在重新初始化常量. (4认同)