Keajaiban barang-barang autoloading
Saya pikir opsi mengendalikan folder dari mana hal autoloading dilakukan telah cukup tercakup dalam jawaban lain. Namun, jika ada orang lain yang mengalami kesulitan memuat barang meskipun mereka telah mengubah jalur muat otomatisnya sesuai kebutuhan, maka jawaban ini mencoba menjelaskan apa keajaiban di balik hal pengisian otomatis ini.
Jadi ketika datang untuk memuat barang dari subdirektori ada gotcha atau konvensi yang harus Anda ketahui. Terkadang sihir Ruby / Rails (saat ini sebagian besar Rails) dapat membuatnya sulit untuk memahami mengapa sesuatu terjadi. Modul apa pun yang dideklarasikan di jalur pengisian otomatis hanya akan dimuat jika nama modul sesuai dengan nama direktori induk. Jadi jika Anda mencoba memasukkan lib/my_stuff/bar.rb
sesuatu seperti:
module Foo
class Bar
end
end
Itu tidak akan dimuat secara otomatis. Kemudian lagi jika Anda mengubah nama orang tua dir ke foo
sehingga tuan modul Anda di jalan: lib/foo/bar.rb
. Itu akan ada untuk Anda. Pilihan lain adalah memberi nama file yang ingin Anda isi ulang secara otomatis dengan nama modul. Tentunya hanya ada satu file dengan nama itu. Jika Anda perlu membagi barang-barang Anda menjadi banyak file tentu saja Anda dapat menggunakan satu file untuk memerlukan file lain, tetapi saya tidak merekomendasikan itu, karena ketika ketika dalam mode pengembangan dan Anda memodifikasi file-file lain maka Rails tidak dapat secara otomatis muat ulang untuk Anda. Tetapi jika Anda benar-benar ingin, Anda dapat memiliki satu file dengan nama modul yang kemudian menentukan file aktual yang diperlukan untuk menggunakan modul. Jadi Anda dapat memiliki dua file: lib/my_stuff/bar.rb
dan lib/my_stuff/foo.rb
yang pertama sama seperti di atas dan yang terakhir berisi satu baris:require "bar"
dan itu akan bekerja sama saja.
PS Saya merasa harus menambahkan satu hal penting lagi. Pada akhir-akhir ini, setiap kali saya ingin memiliki sesuatu di direktori lib yang perlu di-autoload, saya cenderung mulai berpikir bahwa jika ini adalah sesuatu yang sebenarnya saya kembangkan secara spesifik untuk proyek ini (yang biasanya, mungkin suatu hari nanti) berubah menjadi potongan "statis" kode yang digunakan dalam banyak proyek atau git submodule, dll. dalam hal ini pasti harus ada di folder lib) maka mungkin tempatnya tidak ada di folder lib sama sekali. Mungkin itu harus dalam subfolder di bawah folder aplikasi · Saya punya perasaan bahwa ini adalah cara rel baru dalam melakukan sesuatu. Tentunya, sihir yang sama sedang bekerja di mana pun di dalam jalur pengisian otomatis yang Anda letakkan di barang-barang Anda sehingga ada baiknya untuk hal-hal ini. Bagaimanapun, ini hanya pemikiran saya tentang masalah ini. Anda bebas untuk tidak setuju. :)
UPDATE: Tentang jenis sihir ..
Seperti yang ditunjukkan Severin dalam komentarnya, inti "autoload a module module" pasti adalah bagian dari Ruby, tetapi jalur autoload paths tidak. Anda tidak perlu menggunakan Railsautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
. Dan ketika Anda akan mencoba untuk referensi modul Foo untuk pertama kalinya maka itu akan dimuat untuk Anda. Namun apa yang dilakukan Rails adalah memberi kita cara untuk mencoba dan memuat barang secara otomatis dari folder terdaftar dan ini telah dilaksanakan sedemikian rupa sehingga perlu mengasumsikan sesuatu tentang konvensi penamaan. Jika belum diimplementasikan seperti itu, maka setiap kali Anda mereferensikan sesuatu yang saat ini tidak dimuat itu harus melalui semua file di semua folder autoload dan memeriksa apakah ada di antara mereka berisi apa yang Anda coba rujuk. Ini pada gilirannya akan mengalahkan gagasan autoloading dan autoreloading. Namun, dengan konvensi ini di tempat itu dapat mengurangi dari modul / kelas Anda mencoba memuat mana yang mungkin didefinisikan dan hanya memuat itu.
app/lib
.