Rails 3.1: Как мне добавить инициализатор, который запускается после инициализаторов gem? - PullRequest
3 голосов
/ 17 октября 2011

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

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

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

Спасибо!

1 Ответ

3 голосов
/ 17 октября 2011

Ладно - нашел решение.Иногда просто опубликовать вопрос может помочь обдумать его.

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

Так что исправлением было удаление этого в конфигурации 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   
...