Rails 3.1: как мне добавить инициализатор, который запускается после инициализаторов gem?

#ruby-on-rails #ruby-on-rails-3 #factory-bot

#ruby-on-rails #ruby-on-rails-3 #factory-бот

Вопрос:

Мой генератор каркасов перестал работать после того, как мы обновили factory girl. Вот почему это произошло. Во-первых, мой конфигурационный файл пытается настроить определенные значения по умолчанию для генерации каркаса, например:

 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, как я этого хочу.

Я пытался удалить свой собственный raildie в config / initializers или добавить блок в config.after_initialize в config/application.rb и ряд других подходов, но не совсем нашел решение. (Мои знания о последовательности инициализации Rails должны быть немного глубже, чем я думаю).

Спасибо!

Комментарии:

1. Вы смотрели на guides.rubyonrails.org/initialization.html (или railsguts.com/initialization.html для рельсов 2)?

2. Да .. это (и код raildies-3.1.1/lib/rails/initializable.rb — это то, что я читал последние пару часов. Они полезны, но я не вижу (ни из одного источника), как повлиять на порядок созданных инициализаторов.

3. Инициализаторы (например, config/initializers/foobar.rb) загружаются в «алфавитном» порядке. Должно быть довольно легко найти строку кода, которая выполняет фактическую обработку файлов, нет?

Ответ №1:

Хорошо — найдено решение. Иногда просто публикация вопроса может помочь в его обдумывании.

Ответ состоял в том, чтобы установить мой собственный инициализатор в gem, который содержит мой генератор каркасов, и передать:after => «factory_girl.set_fixture_replacement» для инициализации () при создании этого блока. Тот факт, что вы можете указать :after для инициализатора, не задокументирован в документации Rails, но может быть выведен, обнаружив, что Initializable использует TSort для сортировки своей коллекции инициализаторов, исследуя, как работает TSort, и обнаруживая, что сохраненные параметры :after/:before используются в методах, которые вызывает TSortвернуться к.

Итак, исправление состояло в том, чтобы удалить это в конфигурации Raildie для моего собственного gem, который предоставляет генератор каркасов:

 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