2013-07-09 45 views
0

在軌道上使用ruby時,通常使用終端命令,如rake db:migraterails g devise:install。但是這些命令中的:究竟意味着什麼?在rake db:migratemigrate一個參數或別的東西?這似乎不是一個很難的問題,但經過幾個小時對Google的研究並沒有找到答案,我真的很想有人向我解釋這一點。Ruby on Rails:冒號在終端上

+0

看起來Rake文件裏面,你會看到組織到命名空間和任務耙任務。 –

回答

0

像菲利普在他的回答說明使用時耙結腸定義命名空間/任務之間的分隔符

當使用rails g(enerate)這是基本相同。區別在於Rails生成器不是用rake的DSL定義的,而是它們的類。

但是要回答你最初的問題:在這兩種情況下,Colon都是作爲分隔符來工作的,就是這樣。

在代碼什麼它被分裂了繩子是唯一重要的事情: https://github.com/rails/rails/blob/4-0-stable/railties/lib/rails/generators.rb#L124

您可以找到有關發電機和如何創建一個的人更多的相關信息(這definetley將幫助你瞭解力學背後)在官方Ruby on Rails Guides

//編輯 好吧,讓我們來仔細看看發電機查找過程:

首先有Rails::Generators.invoke

它接收的CLI和分裂的它通過了命名空間(使用冒號)

names = namespace.to_s.split(':') 

那麼它獲得通過將通過命名空間(實際的發電機名稱)的最後一部分是在根據類和剩餘部分用冒號加入試(命名空間路徑,在我們的情況下,它色器件)至Rails::Generators::Base.find_by_namespace

if klass = find_by_namespace(names.pop, names.any? && names.join(':')) 

再此方法將加入基地(命名空間路徑)和名稱(發電機名),並把它推到一個數組:

lookups = [] 
lookups << "#{base}:#{name}" if base 

之後,它調用Rails::Generators.lookup這將查找的類調用被叫發電機:

lookup(lookups) 

這將再次會調用Rails::Generators.namepaces_to_paths

有該方法沒有什麼大的魔力,它在我們的例子中,這兩個是「devise/install/install」和「devise/install」,我們只需爲被調用的生成器返回一個包含兩個可能源路徑的數組。

因此,這些不是軌道將檢查的實際路徑,它們只是它的依賴於名稱空間的部分:generator構造。

lookup方法,現在就這兩個,我們姑且稱之爲子路徑,並檢查文件,要求在下列地點:

  1. 軌/發電機/設計/安裝/ install_generator
  2. 發電機/設計/安裝/ install_generator
  3. 軌/發電機/設計/ install_generator
  4. 發電機/設計/ install_generator

在我們的案例中,第二個路徑是所需的文件,rails需要它,並且由於Devise::Generators::InstallGenerator繼承自Devise::Generators::InstallGenerator,因此Rails::Generators::Base上的inheritedmore about that callback)回調將被調用。

這將類添加到subclasses陣列的Rails::Generators,其被映射到散列,這將具有格式{命名空間=>克拉斯}等軌道最終能夠得到所期望的發電機級

klass = namespaces[namespace]

並啓動它

klass.start(args, config)

+0

這有很大的幫助。但是我仍然對它在生成情況下的工作方式感到困惑。實際上,我已經閱讀過多次提到的rails導航指南,但我仍然不明白它是如何適用於我向Phillip展示的設計代碼的。任何幫助將不勝感激。 –

+0

非常感謝,這絕對解決了我的問題! –

3

您可以將冒號視爲命名空間。某處Rails內部有一個rake任務文件,看起來與此類似:

namespace db 
    task :migrate do... 
    .... 
    end 
end 

這是一種方式將相關的任務一起,防止它們與其他任務的碰撞。這樣,你可能有色器件:遷移,分貝:遷移,foobar的:遷移等

+0

所以foo:bar表示命名空間foo,任務:bar? –

+0

是的。請記住,您也可以嵌套命名空間。耙a:b:c:d是完全有效的。 –

+0

至於'rails g設計:安裝',我還是有點困惑。 'rails g devise [model_name]'運行生成器http://bit.ly/15bN3nt,但是'rails g devise:install'運行這個另外一個http://bit.ly/1alZ8gM,即使沒有定義任何任務那裏。對不起,打擾你更多。 –