【问题标题】:How do I change the load order of initializers in Rails?如何更改 Rails 中初始化程序的加载顺序?
【发布时间】:2011-06-14 08:47:30
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

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

    编辑

    引用官方Rails Guide for configuration(感谢zetetic的提示):

    如果您在 您的初始化程序,您可以控制 通过命名加载顺序。例如, 01_critical.rb 将在之前加载 02_normal.rb.

    【讨论】:

    • 好吧,我自己也面临同样的事情,这就是我正在使用的。所以我会和你一起等你:)
    • 我也是这样做的,它也适用于种子文件:它们也按字母顺序排序。我不知道另一种更改顺序的显式方法。
    • 这是“配置 Rails 应用程序”指南中建议的技术:guides.rubyonrails.org/configuring.html
    • @IssacBetesh 这是一个“丑陋”的解决方案,因为如果您必须对其进行编辑,它会产生大量不必要的工作。假设您有 25 个文件,然后添加一个需要先运行的文件。您将新文件设为 01,并且必须增加每个其他文件的数量。或者您可以将其命名为 001 或 0001 等。 config.before_initialize 解决方案要好得多。
    • 这个答案写于 2011 年。在 2015 年初(早期),这种行为似乎仍然有效。我得出结论,这是实现此结果的稳定、可靠的方法。 +1
    【解决方案2】:

    将配置代码放在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!
    

    【讨论】:

      【解决方案3】:

      尽管指南建议在初始化程序文件名前加上数字,但这看起来确实很难看。另一种方法是利用提供的初始化挂钩。见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
      

      【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 这行得通,但是除了在需要的时候运行所需的文件之外,Rails 将在正常运行初始化程序的过程中再次运行该文件(实际上,按照它们出现在目录列表中的顺序)。因此,您需要确保您需要的文件不会执行任何您不想多次运行的操作。例如,如果所需的文件初始化了一个常量,Rails 会警告您正在重新初始化该常量。
      • @MarkSchneider 另一个例子:如果文件插入了带有#use的中间件,中间件将被重新插入。这甚至可能会破坏应用程序。
      • @MarkSchneider 我试图理解为什么会发生这种情况。曾经需要的文件不再需要.. 示例创建一个 test.rb 打开 irb require_relative 'test' > true require_relative 'test' > false
      • @MarkSchneider 我相信是因为 Rails 再次调用了初始化程序。
      • 那是我们过去常做的事情,很不幸地给我们带来了很多误解。我真的不知道为什么使用 rails load 而不是 require 初始化程序...无论如何,-1 因为这会让我失望
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      相关资源
      最近更新 更多