Вызовите задачу более одного раза в генераторе Rails 3 - PullRequest
10 голосов
/ 02 декабря 2010

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

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

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

Ответы [ 5 ]

3 голосов
/ 03 мая 2011

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

Rails::Generators.invoke("active_record:model", ["foo", "--no-migration" ])
Rails::Generators.invoke("active_record:model", ["bar", "--no-migration" ])
2 голосов
/ 05 февраля 2011

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

model(foo)
model(bar
1 голос
/ 24 февраля 2011

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

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

1 голос
/ 24 февраля 2011

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

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

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

0 голосов
/ 29 июля 2013

есть макрос, называемый «поведение», который может помочь (на примере 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
...