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

时间:2010-12-02 02:58:26

标签: ruby-on-rails ruby ruby-on-rails-3 thor

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

model(foo)
model(bar

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

我不知道这样做的优雅方式。在this talk中,我举了两个调用controller生成器的自定义生成器示例 - 请查看幻灯片43.

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

答案 4 :(得分:0)

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