Magia automatycznego ładowania rzeczy
Myślę, że opcja kontrolowania folderów, z których odbywa się automatyczne ładowanie, została wystarczająco opisana w innych odpowiedziach. Jednak w przypadku, gdy ktoś inny ma problemy z załadowaniem rzeczy, mimo że zmodyfikowano ich ścieżki automatycznego ładowania zgodnie z wymaganiami, odpowiedź ta próbuje wyjaśnić, na czym polega magia tego ładowania automatycznego.
Więc jeśli chodzi o ładowanie rzeczy z podkatalogów, musisz mieć gotcha lub konwencję, o której powinieneś wiedzieć. Czasami magia Ruby / Rails (tym razem głównie Rails) może utrudnić zrozumienie, dlaczego coś się dzieje. Każdy moduł zadeklarowany w ścieżkach automatycznego ładowania zostanie załadowany tylko wtedy, gdy nazwa modułu odpowiada nazwie katalogu nadrzędnego. Na wypadek, gdybyś spróbował wprowadzić lib/my_stuff/bar.rb
coś takiego:
module Foo
class Bar
end
end
Nie zostanie załadowany automatycznie. Potem znowu, jeśli zmiana nazwy nadrzędnej dir aby foo
w ten sposób gospodarzem modułu w ścieżce: lib/foo/bar.rb
. Będzie tam dla ciebie. Inną opcją jest nadanie nazwy pliku, który chcesz automatycznie załadować, według nazwy modułu. Oczywiście wtedy może istnieć tylko jeden plik o tej nazwie. Jeśli chcesz podzielić swoje pliki na wiele plików, możesz oczywiście użyć tego jednego pliku, aby wymagać innych plików, ale nie polecam tego, ponieważ wtedy, gdy jesteś w trybie programowania i modyfikujesz te inne pliki, Rails nie jest w stanie automagicznie przeładuj je dla ciebie. Ale jeśli naprawdę chcesz, możesz mieć jeden plik według nazwy modułu, który określa rzeczywiste pliki wymagane do korzystania z modułu. Więc możesz mieć dwa pliki: lib/my_stuff/bar.rb
i lib/my_stuff/foo.rb
ten pierwszy jest taki sam jak powyżej, a drugi zawiera jedną linię:require "bar"
i to działałoby tak samo.
PS Czuję się zmuszony dodać jeszcze jedną ważną rzecz. Ostatnio, kiedy chcę mieć coś w katalogu lib, który wymaga automatycznego załadowania, zaczynam myśleć, że jeśli jest to coś, co faktycznie opracowuję specjalnie dla tego projektu (co zwykle jest, może to pewnego dnia zamienia się w „statyczny” fragment kodu używany w wielu projektach lub podmoduł git itp., w którym to przypadku zdecydowanie powinien znajdować się w folderze lib), być może jego miejsce w ogóle nie znajduje się w folderze lib. Być może powinien on znajdować się w podfolderze w folderze aplikacji · Mam wrażenie, że jest to nowy sposób robienia rzeczy. Oczywiście, ta sama magia działa wszędzie tam, gdzie w tobie są ładowane ścieżki, w które wkładasz swoje rzeczy, więc dobrze jest z tymi rzeczami. W każdym razie to tylko moje przemyślenia na ten temat. Możesz się nie zgodzić. :)
AKTUALIZACJA: O rodzaju magii ..
Jak zauważył Severin w swoim komentarzu, rdzeń „autoload a module module” z pewnością jest częścią Ruby, ale ścieżki autoload nie są. Nie potrzebujesz do tego Railsówautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
. A kiedy spróbujesz po raz pierwszy odwołać się do modułu Foo, zostanie on dla Ciebie załadowany. Jednak to, co robi Rails, to sposób na automatyczne ładowanie rzeczy z zarejestrowanych folderów, co zostało zaimplementowane w taki sposób, że musi on założyć coś o konwencjach nazewnictwa. Jeśli nie został tak zaimplementowany, to za każdym razem, gdy odwołujesz się do czegoś, co nie jest aktualnie załadowane, musiałby przejść przez wszystkie pliki we wszystkich folderach automatycznego ładowania i sprawdzić, czy którykolwiek z nich zawiera to, co próbujesz odwołać. To z kolei podważyłoby ideę automatycznego ładowania i automatycznego ładowania. Jednak dzięki tym konwencjom można odjąć od modułu / klasy, którą próbujesz załadować tam, gdzie można to zdefiniować, i po prostu załadować.
app/lib
.