在Rails 3生成器中多次调用任务

我正在编写一个Rails 3生成器,它可以创建两个不同的模型。 这是我正在尝试做的一个非常简单的例子:

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

问题是Thor调用方法只调用一次任务,因此第二次调用“模型”任务永远不会发生,并且永远不会创建“bar”模型。 有没有人知道一个优雅的方法来实现这一点,最好是以一种不会破坏与发电机运行“rails destroy”的能力的方式?

还有一种想法,这种方式也可以在不迁移的情况下运行多个模型生成器

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

使用Thor,如果要调用具有依赖关系管理的任务,只需直接调用它:

 model(foo) model(bar 

如果你想运行一个Thor :: Group子类的生成器,即不只是一个Thor任务,你可以从任何不同的文件调用整个生成器。

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

railties / rails中的生成器模块generator.rb似乎创建了一个新实例,因此它不认为该任务已被调用。 这意味着您可以根据需要重复上述行,并且每次都会运行。

我不知道这样做的优雅方式。 在这次演讲中 ,我给出了一个调用controller生成器两次的自定义生成器的示例 – 请查看幻灯片43。

不太优雅的方法是进入Thor的@_invocations数组,并在再次运行之前删除第一个运行的任务。

有一个叫做“行为”的宏方法可以帮助(使用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