我正在尝试宝石开发,现在专门用于生成器。到目前为止,我已经成功创建了两个完美地完成工作的发生器。这两个生成器位于同一目录中。
但是,现在我必须分别给他们打电话。
我想做的就是调用一台发电机并让发电机调用所有其他发电机。只需输入
rails g generator_name
这会调用x其他生成器。
有谁知道我会怎么做到这一点?
非常感谢帮助,谢谢!
答案 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宝石,这个问题也可以帮助:
答案 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 generate
,rails 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文档。