2012-07-18 45 views
9

是否所有文件的ruby約定與文件夾結構(與java包類似)的模塊中?是否所有的ruby文件都具有與文件夾結構匹配的模塊結構?

舉例來說,如果我有一個文件結構,看起來像

的lib /人/ utils的

會在這裏的文件具有模塊結構,如:

module People 
    module Utils 
    # some functionality for People::Utils 
    end 
end  

原因我問,因爲我一直在閱讀一些rails代碼,似乎有幾個文件是這樣的文件結構,但沒有任何模塊聲明。

我猜這將是所以你可以使用效用函數,而不必包括People::Utils

在模塊應該何時使用以及何時不應該使用ruby時,是否存在一個約定?

回答

4

將類和文件放在類似的結構中通常是一個好主意,因爲它可以使人們更容易將類的名稱映射到其定義。

但它可以有意義不這樣做(最終你構造你的代碼,無論你喜歡)。偶爾有很多小班都在處理同一件事,我把它們放在一起。

可以有一個沒有定義模塊或類的文件,例如配置文件或二進制文件或引導文件(加載所有其他文件的文件)。

12

這是Rails中的標準。 Rails加載模型的方式是通過查看文件夾結構來猜測類的位置。我們有所謂的autoload_paths

您可以通過調用找到他們的rails console(這有點哈克,有可能是向他們展示一個更簡單的方法):在您的config/application.rb配置

app.instance_variable_get(:"@app").instance_variable_get(:"@_all_autoload_paths") 

默認的Rails應用程序的輸出,而不config.autoload_paths += %W(#{config.root}/lib)塊應該是這樣的:

["/Users/lunks/Code/rsvp/app/assets", 
"/Users/lunks/Code/rsvp/app/controllers", 
"/Users/lunks/Code/rsvp/app/helpers", 
"/Users/lunks/Code/rsvp/app/mailers", 
"/Users/lunks/Code/rsvp/app/models"] 

所以,如果你有app/models/something/util.rb和你打電話Something::Util的地方,它會考慮這些路徑,找到app/models/文件夾something/util.rb並加載。

另一方面,紅寶石並不關心這一點。在普通Ruby中自動加載的工作方式如this page所述。您必須使用自動加載或直接需要文件(並且文件夾結構不會有任何意義)。

+0

並在後面的Rails版本中列出autoload_paths:'Rails.application.instance_variable_get(:「@_ all_autoload_paths」)' – valk 2016-07-01 10:32:49