Вызов вызова более одного раза в генераторе Rails 3
Я пишу генератор Rails 3, который создает две разные модели. Здесь очень упрощенный пример того, что я пытаюсь сделать:
def my_generator_task
invoke "model", ["foo"]
invoke "model", ["bar"]
end
Проблема заключается в том, что Thor invoke method запускает задачу только один раз, поэтому второй вызов задачи "model" никогда не происходит, и Модель "бар" никогда не создается. Кто-нибудь знает элегантный способ достичь этого, предпочтительно таким образом, чтобы не нарушить способность запускать "rails destroy" с генератором?
Ответы
Ответ 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