Исправление проблем с Rails-генератором: двойной вызов одного и того же генератора и отсутствие выхода из 0 без запуска второго генератора - PullRequest
4 голосов
/ 25 января 2020

Мы на Rails 5, и у нас есть процесс, который мы пытаемся автоматизировать, который включает в себя создание нескольких моделей. Мы сделали собственный генератор, который, между прочим, обрабатывает это.

Первый шаг создает некоторые файлы, которые нам нужны, и работает великолепно, однако мы начали связывать вещи и заметили нечто довольно странное:

Если мы запускаем invoke model some_args более одного раза, второй run ничего не делает и завершает работу с кодом состояния 0. Когда это происходит, мы находимся где-то в слое Rack, однако, похоже, что если мы изменим invoke на другой генератор, он будет работать нормально. выполнить генератор:

`rails g model`

Вот код:

require "rails/generators"
require_relative "helpers/scaffold_generator_helper"
module ActiveCsv
  class ModelScaffoldGenerator < Rails::Generators::NamedBase
    desc <<~DESCRIPTION
    This Generator takes a file containing a class inheriting from ActiveCsv 
    and produces 3 models and migrations (SourceModel, DestinationModel, FailedImportModel) 
    based on the configurations within the object
    DESCRIPTION
    def load_object_params
      @helper = ActiveCSVScaffoldGeneratorHelper.new(name)
      @params = @helper.extract_parameters
      puts @params
    end

    def handle_source_model
      case self.behavior
      when :invoke
        args = @helper.generate_source_model_options
        created_files = invoke("model", args)
        created_class_name = created_files[0][0][0]
        created_model_path = created_files[0][2]
        inject_into_class(created_model_path, created_class_name) do
          "  acts_as_copy_target\n"
        end
      when :revoke
        invoke "model", [@helper.source_model_name], behavior: :revoke
      end
    end

    def handle_destination_model
      case self.behavior
      when :invoke
        args = @helper.generate_destination_model_options
        created_files = invoke("model", args)
      when :revoke
        invoke "model", [@helper.destination_model_name], behavior: :revoke
      end
    end
  end
end

Разве нельзя запускать один и тот же генератор несколько раз внутри другого генератора?

1 Ответ

2 голосов
/ 29 января 2020

Оказывается, проблема заключается в Торе - он будет читать только первый оператор invoke в любом генераторе. Нашел решение в этом ответе на вопрос о генераторах rails 3 - оказывается, с тех пор оно не изменилось.

Цитируя исходный ответ:

"Однако есть одна загвоздка: вероятно, из-за управления зависимостями Thors, это работает только один раз для каждого генератора, который вы хотите вызвать, что означает, что второй вызов того же генератора ничего не будет делать. Это можно обойти, используя выражение типа

Rails::Generators.invoke 'active_record:model', '...', behavior: behavior "

Так что замена invoke на Rails::Generators.invoke полностью сделала свое дело.

...