如何让发电机调用轨道3中的其他发电机

时间:2011-05-04 22:34:30

标签: ruby-on-rails ruby gem generator

我正在尝试宝石开发,现在专门用于生成器。到目前为止,我已经成功创建了两个完美地完成工作的发生器。这两个生成器位于同一目录中。

但是,现在我必须分别给他们打电话。

我想做的就是调用一台发电机并让发电机调用所有其他发电机。只需输入

rails g generator_name

这会调用x其他生成器。

有谁知道我会怎么做到这一点?

非常感谢帮助,谢谢!

4 个答案:

答案 0 :(得分:22)

在您的生成器中,您只需调用

即可
generate "some:generator" # can be anything listed by 'rails g'

例如:

module MyGem
  class InstallGenerator < Rails::Generators::Base

    def run_other_generators
      generate "jquery:install" # or whatever you want here
    end

  end
end

顺便说一下,如果您正在使用Rails 3宝石,这个问题也可以帮助:

Rails 3 generators in gem

答案 1 :(得分:9)

另一种可能性是使用类似

的东西
invoke 'active_record:model', 'foo bar:string baz:float'

不像generate那样干净,但有一个好处:当你的生成器通过rails destroy调用时,这个调用 - 就像其他Thors动作一样 - 会尝试撤销动作您invoke的生成器。

但是有一个问题:可能是由于Thors依赖关系管理,这只对你想要调用的每个生成器有效一次,这意味着同一个生成器的第二个invoke将什么都不做。这可以通过使用像

这样的语句来规避
Rails::Generators.invoke 'active_record:model', '...', behavior: behavior

代替。在这种情况下,您必须明确地传递生成器的behavior(这是一个返回值:invoke:revoke以及可能其他值的方法,具体取决于哪个命令 - {{1 }},rails generaterails destroy等 - 称为您的生成器)以获得与上述相同的结果。如果您不这样做,使用rails update运行生成器时,也会执行使用Rails::Generators.invoke调用的生成器。

或者你可以坚持rails destroy并试图篡改Thors调用系统。另请参见here

答案 2 :(得分:1)

生成器基于Thor,因此您可以使用apply method

这是Rails Templater gem的作用。 (Here's走过Rails Templater宝石。)

答案 3 :(得分:0)

看看带有导轨的脚手架发电机。

  

/Users/XYZ/sources/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb

def manifest
    record do |m|
      #....rest of the source is removed for brevity....
      m.dependency 'model', [name] + @args, :collision => :skip
    end
  end

这里脚手架生成器正在使用模型生成器。所以看看依赖方法。您可以通过here找到它的API文档。