Магія автозавантаження матеріалів
Я думаю, що варіант управління папками, з яких робиться автоматичне завантаження, був достатньо висвітлений в інших відповідях. Однак якщо у когось іншого виникають проблеми із завантаженням матеріалів, хоча вони змінили шляхи автозавантаження відповідно до необхідності, тоді ця відповідь намагається пояснити, у чому полягає магія цієї речі автозавантаження.
Тож, коли мова заходить про завантаження матеріалів з підкаталогів, то тут слід знати, чи є умова або умова. Іноді магія Ruby / Rails (цього разу переважно Рейки) може ускладнити розуміння того, чому щось відбувається. Будь-який модуль, оголошений у шляхах автозавантаження, завантажується лише у тому випадку, якщо ім'я модуля відповідає імені батьківського каталогу. Тож у випадку, якщо ви намагаєтеся вкласти lib/my_stuff/bar.rb
щось подібне:
module Foo
class Bar
end
end
Він не завантажується автоматично. Потім ще раз , якщо ви перейменувати батьківські директорії для foo
таким чином , хостингу для вашого модуля в дорозі: lib/foo/bar.rb
. Це буде для вас. Інший варіант - назвати файл, який ви хочете автоматично завантажити за назвою модуля. Очевидно, що тоді може бути лише один файл під цим іменем. У випадку, якщо вам потрібно розділити свої речі на багато файлів, ви, звичайно, можете використовувати цей один файл, щоб вимагати інших файлів, але я не рекомендую цього, тому що тоді, коли в режимі розробки і ви змінюєте ці інші файли, тоді Rails не може автоматично автоматично. перезавантажте їх для вас. Але якщо ви дійсно хочете, ви могли б мати один файл за назвою модуля, який потім визначає фактичні файли, необхідні для використання модуля. Отже, у вас може бути два файли: lib/my_stuff/bar.rb
і lib/my_stuff/foo.rb
перший, такий же, як вище, а останній містить один рядок:require "bar"
і це працювало б так само.
PS Я змушений додати ще одну важливу річ. Останнім часом, коли я хочу мати щось у каталозі lib, яке потребує автоматичного завантаження, я схильний починати думати, що якщо це щось, що я насправді розробляю спеціально для цього проекту (який, як правило, є, це може бути якийсь день перетвориться на "статичний" фрагмент коду, який використовується у багатьох проектах, або підмодуль git тощо. У такому випадку він обов'язково повинен бути в папці lib), можливо, його місце взагалі не знаходиться в папці lib. Можливо, це має бути в підпапці під папкою додатків. · У мене є відчуття, що це новий спосіб рейки. Очевидно, та ж магія є в роботі, де б ви не завантажили шляхи автозавантаження, щоб ви вміли вносити свої речі. У всякому разі, це лише мої думки з цього приводу. Ви вільні не погоджуватися. :)
ОНОВЛЕННЯ: Про тип магії ..
Як зазначив Северін у своєму коментарі, ядро "механізм автоматичного завантаження модуля" впевнене, що це частина Ruby, однак шлях автозавантаження не відповідає. Вам не потрібні рейлиautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
. І коли ви спробуєте вперше посилатися на модуль Foo, тоді він буде завантажений для вас. Однак те, що робить Rails, це дає нам можливість спробувати завантажувати матеріали автоматично з зареєстрованих папок, і це було реалізовано таким чином, що йому потрібно припустити щось про умови іменування. Якби вона не була реалізована таким чином, то кожного разу, коли ви посилаєтесь на щось, що не завантажено в даний момент, вам доведеться пройти всі файли у всіх папках автозавантаження та перевірити, чи містить у собі те, на що ви намагалися посилатися. Це, у свою чергу, переможе ідею автозавантаження та автозавантаження. Однак, маючи ці умовні положення, він може вирахувати з модуля / класу вашу спробу завантажити, де це може бути визначено, і просто завантажити його.
app/lib
.