Подтвердить что ты не робот

Вызов вызова более одного раза в генераторе Rails 3

Я пишу генератор Rails 3, который создает две разные модели. Здесь очень упрощенный пример того, что я пытаюсь сделать:

def my_generator_task
  invoke "model", ["foo"]
  invoke "model", ["bar"]
end

Проблема заключается в том, что Thor invoke method запускает задачу только один раз, поэтому второй вызов задачи "model" никогда не происходит, и Модель "бар" никогда не создается. Кто-нибудь знает элегантный способ достичь этого, предпочтительно таким образом, чтобы не нарушить способность запускать "rails destroy" с генератором?

4b9b3361

Ответ 1

Еще одна мысль, таким образом, также возможно запустить несколько генераторов моделей без миграции

Rails::Generators.invoke("active_record:model", ["foo", "--no-migration" ])
Rails::Generators.invoke("active_record:model", ["bar", "--no-migration" ])

Ответ 2

С помощью Thor, если вы хотите вызвать задачу с управлением зависимостями OUTOUT, вы просто вызываете ее напрямую:

model(foo)
model(bar

Ответ 3

Если вы хотите запустить генератор подклассов из Thor:: Group, т.е. не только одну задачу Thor, вы можете вызвать весь генератор из любого другого файла.

Rails::Generators.invoke("my_generator", my_generator_args)

Генераторы generators.rb в railties/rails, похоже, создают новый экземпляр, поэтому он не считает, что задача уже вызвана. Это означает, что вы можете повторять указанную выше строку столько раз, сколько хотите, и она будет запускаться каждый раз.

Ответ 4

Я не знаю, как это сделать. В этот разговор, я привел пример пользовательского генератора, который дважды запускает генератор controller - просмотрите слайд 43.

Неэлегантным способом является переход в массив Thor @_invocations и удаление первых задач запуска перед повторным запуском.

Ответ 5

существует способ макросов, называемый "поведение", который может помочь (используя пример bonyiii):

def generate_model
  if behavior == :invoke
    Rails::Generators.invoke("active_record:model", ["foo", "--no-migration"], behavior: behavior)
    Rails::Generators.invoke("active_record:model", ["bar", "--no-migration"], behavior: behavior)
  else # behavior == :revoke
    Rails::Generators.invoke("active_record:model", ["foo", "--no-migration"], behavior: :revoke)
    Rails::Generators.invoke("active_record:model", ["bar", "--no-migration"], behavior: :revoke)
  end
end

или просто:

def generate_model
  Rails::Generators.invoke("active_record:model", ["foo", "--no-migration"], behavior: behavior)
  Rails::Generators.invoke("active_record:model", ["bar", "--no-migration"], behavior: behavior)
end