2011-05-04 58 views
12

我正在試驗寶石的發展,現在特別是發電機。到目前爲止,我已經成功創建了兩個完美工作的發電機。這兩個生成器位於相同的目錄中。如何讓發電機在軌道上調用其他發電機3

但是,現在我必須分別打電話給他們每個人。

我想要做的只是調用一個生成器,並讓該生成器調用所有其他的生成器。只要鍵入

rails g generator_name 

這會調用x個其他發生器。

有誰知道我會怎麼做到這一點?

非常感謝幫助,謝謝!

回答

21

在你的生成器,你可以叫

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 

順便說一句,如果你是on Rails的工作3寶石,這個問題也可以幫到:

Rails 3 generators in gem

+3

把params傳入被調用的生成器怎麼樣? – Ziggy 2013-12-02 17:30:56

+2

@ziggy生成'generator','arguments' – efoo 2014-02-11 22:09:36

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文檔。

9

另一種可能性是使用類似

invoke 'active_record:model', 'foo bar:string baz:float' 

這是不一樣generate乾淨,但有一個好處:當你的發電機被通過rails destroy調用,這個調用 - 像其他可能的行動雷神的 - 將嘗試撤銷發電機的動作invoke

但是有一個問題:可能是由於托爾斯依賴管理,這隻適用於每個發電機要調用一次,這意味着同一發電機的第二個invoke什麼也不會做。這可以通過使用類似於

Rails::Generators.invoke 'active_record:model', '...', behavior: behavior 

的語句來避開。在這種情況下,您必須明確地通過發電機的behavior(這是一種返回值如:invoke,:revoke和其他可能的值的方法,具體取決於哪個命令 - rails generate,rails destroy,rails update等 - 稱爲您的發電機)到達到與上述相同的結果。如果您不這樣做,當您使用rails destroy運行發電機時,您使用Rails::Generators.invoke調用的發電機也將被執行。

或者,您可以堅持invoke並嘗試篡改Thors調用系統。例如,另請參閱here

+0

你也可以調用一個生成器來調用,例如調用'cucumber:install'...這樣做的好處是,當你試圖回滾生成器時(使用rails d mygenerator:mytask),它將正確地*撤消*命令。希望是有道理的! – 2012-12-16 22:42:28

+0

'Rails :: Generators.invoke'active_record:model',[「bar」],:migration => false'忽略遷移錯誤標誌或任何選項。深入挖掘它看起來像只是在執行「invoke ...」時調用的invoke方法與Rails :: Generators.invoke不一樣。因此,如果您需要傳遞生成器選項:'Rails :: Generators.invoke'active_record:model',[「bar」,「--no-migration」])' – ErJab 2014-03-26 00:05:01