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

Ben*_*Ben 13 ruby gem ruby-on-rails generator

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

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

我想做的就是调用一台发电机并让发电机调用所有其他发电机.只是打字

rails g generator_name
Run Code Online (Sandbox Code Playgroud)

这将调用x其他生成器.

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

非常感谢帮助,谢谢!

Mik*_*mer 22

在你的发电机里,你可以打电话

generate "some:generator" # can be anything listed by 'rails g'
Run Code Online (Sandbox Code Playgroud)

例如:

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

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

  end
end
Run Code Online (Sandbox Code Playgroud)

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

宝石中的Rails 3发电机

  • 将params传递给调用的生成器怎么样? (3认同)
  • @ziggy生成'generator','arguments' (2认同)

Jul*_*off 9

另一种可能性是使用类似的东西

invoke 'active_record:model', 'foo bar:string baz:float'
Run Code Online (Sandbox Code Playgroud)

它不是那么干净generate,但有一个优点:当你的发电机被通过时rails destroy,这个电话 - 就像其他Thors行动一样 - 会试图撤销你的发电机的动作invoke.

但是有一个问题:可能是由于Thors依赖关系管理,这只适用于你想要调用的每个生成器一次,这意味着invoke同一个生成器的第二个将无能为力.这可以通过使用类似的语句来规避

Rails::Generators.invoke 'active_record:model', '...', behavior: behavior
Run Code Online (Sandbox Code Playgroud)

代替.在这种情况下,你必须明确地通过behavior您的发电机(这是一个方法,返回值一样:invoke,:revoke可能还有其他人,根据其命令- ,,rails generate 等-所谓的发电机)来实现与上述相同的结果.如果不这样做,则在运行发电机时也会执行调用的发电机.rails destroyrails updateRails::Generators.invokerails destroy

或者你可以坚持invoke并试图篡改Thors调用系统.另请参见此处.