Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails 3生成器中多次调用任务_Ruby On Rails_Ruby_Ruby On Rails 3_Thor - Fatal编程技术网

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

Ruby on rails 在Rails 3生成器中多次调用任务,ruby-on-rails,ruby,ruby-on-rails-3,thor,Ruby On Rails,Ruby,Ruby On Rails 3,Thor,我正在编写一个Rails 3生成器,它创建了两个不同的模型。下面是一个非常简单的示例,说明我正在尝试做的事情: def my_generator_task invoke "model", ["foo"] invoke "model", ["bar"] end 问题是,只调用一次任务,因此不会发生对“model”任务的第二次调用,也不会创建“bar”模型。有没有人知道一种优雅的方法来完成这一点,最好是不破坏使用生成器运行“rails destroy”的能力?对于Thor,如果您想在不使用

我正在编写一个Rails 3生成器,它创建了两个不同的模型。下面是一个非常简单的示例,说明我正在尝试做的事情:

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

问题是,只调用一次任务,因此不会发生对“model”任务的第二次调用,也不会创建“bar”模型。有没有人知道一种优雅的方法来完成这一点,最好是不破坏使用生成器运行“rails destroy”的能力?

对于Thor,如果您想在不使用依赖关系管理的情况下调用任务,只需直接调用它:

model(foo)
model(bar

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

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

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

我不知道有什么优雅的方法可以做到这一点。在中,我给出了一个自定义生成器的示例,它两次调用
控制器
生成器-查看幻灯片43


不雅观的方法是进入Thor的
@\u调用
数组,删除第一次运行的任务,然后再运行它。

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

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

有一个名为“行为”的宏方法可以提供帮助(使用bonyiii的示例):

或者只是:

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

+1-在
invoke:method[arguments]之后,options
使用
@\u调用。首先[1]。pop
从调用列表中删除最近调用的任务。另请参阅:
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