ruby-on-rails - rails 3.1 : How do i add an initializer that runs after gem initializers?

标签 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,如我所愿。

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

谢谢!

最佳答案

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

答案是在包含脚手架生成器的 gem 中设置我自己的初始化程序,并在创建该 block 时将 :after => "factory_girl.set_fixture_replacement"传递给 initialize()。您可以指定 :after 到初始化器这一事实没有记录在 Rails docco 中,但可以通过发现 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   

关于ruby-on-rails - rails 3.1 : How do i add an initializer that runs after gem initializers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7788891/

相关文章:

ruby-on-rails - Github Action 和RAILS_MASTER_KEY

ruby-on-rails - xmpp 服务器和 ruby​​ on rails 集成建议?

ruby-on-rails-3 - 在 FB API 调用中“无法代表该用户调用 API”

mysql - 如何在 text_field 中设置值并将这些值存储到 Rails 中的数据库表中

ruby-on-rails - Rails 3 : “:method => :post” doesn't work… seems to be 'GET' when it should 'POST'

html - 在数据库中存储 html 组件

ruby-on-rails - RubyMine 显示错误消息 : "Error running Development: MyProject: Rails 3.x launcher script was found instead of Rails 4.x one"

ruby-on-rails - 如何避免在 factory_girl 中循环创建关联模型?

ruby-on-rails - 访问* other *工厂中的factory_girl工厂

ruby-on-rails - 在我的单元测试中,fixture 和 factory 有什么区别?