10

I'm writing a Rails 3 generator that creates two different models. Here's a very simplified example of what I'm trying to do:

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

The problem is that the Thor invoke method only invokes a task once, so the second call to the "model" task never happens and the "bar" model is never created. Does anyone know an elegant way to accomplish this, preferably in a way that doesn't break the ability to run "rails destroy" with the generator?

4

5 回答 5

3

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

Rails::Generators.invoke("active_record:model", ["foo", "--no-migration" ])
Rails::Generators.invoke("active_record:model", ["bar", "--no-migration" ])
于 2011-05-03T07:02:48.763 回答
2

使用 Thor,如果你想调用一个没有依赖管理的任务,你只需直接调用它:

model(foo)
model(bar
于 2011-02-05T07:17:56.040 回答
1

如果您想运行从 Thor::Group 继承的生成器,即不仅仅是单个 Thor 任务,您可以从任何不同的文件调用整个生成器。

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

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

于 2011-02-23T23:51:32.827 回答
1

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

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

于 2011-02-23T23:57:06.630 回答
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
于 2013-07-29T10:43:15.177 回答