自動裝飾品的魔力
我認為控制自動裝填的文件夾的選項在其他答案中已經足夠了。然而,如果其他人有困難的東西加載,雖然他們已經修改了他們的自動路徑要求,然后這個答案試圖解釋什么是魔術背后的自動加載的事情。
因此,在從子目錄加載內容時,您應該注意到一個問題或約定。有時候,Ruby/Rails的魔力(這次主要是Rails)會讓人很難理解為什么會發生一些事情。只有當模塊名稱與父目錄名稱相對應時,自動加載路徑中聲明的任何模塊才會被加載。所以如果你想把lib/my_stuff/bar.rb
類似于:
module Foo
class Bar
endend
它不會自動加載。如果將父dir重命名為foo
因此,將模塊托管在PATH上:lib/foo/bar.rb
..它會在你身邊的。另一個選項是將您想要的文件命名為模塊名。很明顯,那么只能有一個名為這個名稱的文件。如果您需要將您的文件拆分成許多文件,您當然可以使用該文件來要求其他文件,但我不建議這樣做,因為在開發模式和修改其他文件時,Rails無法自動為您重新加載這些文件。但是,如果您真的想要的話,您可以按模塊名獲得一個文件,然后指定使用該模塊所需的實際文件。所以你可以有兩個文件:lib/my_stuff/bar.rb
和lib/my_stuff/foo.rb
前者與上面相同,后者包含一條單行:require "bar"
這也同樣有效。
我覺得我不得不補充一件更重要的事情。最近,每當我想要在lib目錄中有一些需要自動加載的內容時,我就會開始想,如果這是我專門為這個項目開發的東西(通常是這樣的),有一天它可能會變成許多項目或Git子模塊中使用的“靜態”代碼片段,等等。在這種情況下,它肯定應該在lib文件夾中),那么它的位置可能根本不在lib文件夾中。也許它應該在應用程序文件夾下的一個子文件夾中。我有一種感覺,這是一種新的Rails方式。顯然,同樣的魔法也在起作用,不管你把你的東西放在什么地方,它對這些東西都有好處。總之,這只是我對這個問題的想法。你可以自由地不同意。*)
更新:關于魔法的類型.。
正如Severin在他的評論中指出的那樣,核心的“自動加載模塊機制”當然是Ruby的一部分,但是自動加載路徑不是。autoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
..當您第一次嘗試引用模塊foo時,它將為您加載。然而,Rails所做的是,它為我們提供了一種嘗試從已注冊文件夾中自動加載東西的方法,并且已經以這樣一種方式實現了,即它需要假定一些關于命名約定的內容。如果沒有這樣實現,那么每次引用當前未加載的內容時,它都必須遍歷所有autooload文件夾中的所有文件,并檢查其中是否包含您試圖引用的內容。這反過來又會挫敗自動加載和自動加載的想法。但是,有了這些約定之后,它可以從您試圖加載的模塊/類中扣除可能定義的內容,并只加載該模塊/類。