【问题标题】:Rails 3.1: How do i add an initializer that runs after gem initializers?Rails 3.1:如何添加在 gem 初始化程序之后运行的初始化程序?
【发布时间】:2011-10-17 02:43:29
【问题描述】:

更新工厂女孩后,我的脚手架生成器停止工作。这就是发生的原因。首先,我的配置文件尝试为脚手架生成设置某些默认值,如下所示:

class Application < Rails::Application
  config.app_generators do |g|
    g.template_engine     'mizugumo:haml'
    g.scaffold_controller 'mizugumo:scaffold_controller'
    g.assets              'mizugumo:js_assets'
    g.test_framework      :lrdspec, :fixture => true
    g.fixture_replacement 'lrdspec:factory'

    g.fallbacks['mizugumo:haml']  = :haml
    g.fallbacks[:lrdspec] = :rspec
  end
  ...
end

其中 :lrdspec 是我公司的脚手架规范生成器的名称。但是,最新的 factory_girl_rails 在其初始化程序中粗鲁地强制 config.generators.test_framework 为 'test_unit',除非您的测试框架完全是 ":rspec":

module FactoryGirl
  class Railtie < Rails::Railtie

  initializer "factory_girl.set_fixture_replacement" do
    generators = config.respond_to?(:app_generators) ? config.app_generators : config.generators

    if generators.options[:rails][:test_framework] == :rspec
      generators.fixture_replacement :factory_girl, :dir => 'spec/factories'
    else
      generators.test_framework :test_unit, :fixture => false, :fixture_replacement => :factory_girl
    end
  end

我想弄清楚如何做,是生成我自己的在 FG 的初始化程序之后运行的初始化程序,将 test_framework 设置回 :lrdspec,如我所愿。

我尝试将自己的 railtie 放入 config/initializers,或者在 config/application.rb 中向 config.after_initialize 添加一个块,以及其他一些方法,但还没有找到解决方案。 (我对 Rails 初始化序列的了解需要比我认为的更深入一些)。

谢谢!

【问题讨论】:

  • 是的 .. 那(以及 railties-3.1.1/lib/rails/initializable.rb 的代码是我过去几个小时一直在阅读的内容。它们很有帮助,但是我看不到(来自任一来源)如何影响创建的初始化程序的 order
  • 初始化程序(例如 config/initializers/foobar.rb)按“字母”顺序加载。应该很容易找到对文件进行实际 grepping 的代码行,不是吗?

标签: ruby-on-rails ruby-on-rails-3 factory-bot


【解决方案1】:

好的 - 找到了解决方案。有时仅仅发布一个问题就可以帮助您思考问题。

答案是在包含我的脚手架生成器的 gem 中设置我自己的初始化程序,并在我创建该块时将 :after => "factory_girl.set_fixture_replacement" 传递给 initialize()。 Rails docco 中没有记录您可以为初始化程序指定 :after 的事实,但可以通过发现 Initializable 使用 TSort 对其初始化程序集合进行排序、研究 TSort 的工作原理以及发现存储的 :after/ :before 参数用于 TSort 回调的方法中。

所以解决方法是将它放到我自己的 gem 的配置 Railtie 中,它提供了脚手架生成器:

initializer "lrd_dev_tools.set_generators", :after => 'factory_girl.set_fixture_replacement' do
  generators = config.respond_to?(:app_generators) ? config.app_generators : config.generators
  generators.test_framework :lrdspec, :fixture => true
  generators.fixture_replacement 'lrdspec:factory'      
end   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 2013-04-06
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2011-11-25
    • 2019-04-28
    相关资源
    最近更新 更多