Rails 3.1:如何添加在gem初始化程序之后运行的初始化程序?

时间:2011-10-17 02:43:29

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

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

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,就像我想要的那样。

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

谢谢!

1 个答案:

答案 0 :(得分:3)

好的 - 找到了解决方案。有时只是发布一个问题可以帮助你思考它。

答案是在我的脚手架生成器的宝石中设置我自己的初始化器,然后传递:after =&gt; “factory_girl.set_fixture_replacement”在我创建该块时初始化()。您可以指定的事实:在初始化程序之后没有记录在Rails docco中,但可以通过发现Initializable使用TSort对其初始化程序集合进行排序,研究TSort如何工作,以及发现存储的:after / :在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