2010-05-04 13 views
9

Próbuję ponownie otworzyć klasę String w szynach i dodać kilka dodatkowych metod do mojej aplikacji. Pisanie kodu nie stanowi problemu - moje pytanie dotyczy raczej tego, gdzie powinien się znaleźć ten kod.Gdzie ponownie otworzyć klasę w RoR

Nie ma sensu ponownie otwierać klasy w innym pliku modelu, ponieważ nie ma to żadnego związku z żadnym z modeli. Pomyślałem, że może gdzieś w config lub lib miałoby sens, ale nie jestem jeszcze dobrze zorientowany w RoR.

Podsumowując, gdzie byłoby najbardziej logiczne miejsce do zdefiniowania kodu modyfikującego klasę i czy są jakieś implikacje w zależności od miejsca/czasu załadowania kodu?

Odpowiedz

18

Najbardziej logiczne miejsce znajduje się prawdopodobnie w pliku w katalogu config/initializers. Każdy wstawiony tutaj plik *.rb zostanie automatycznie wykonany po uruchomieniu szyny. Jeśli chcesz, możesz umieścić je w podkatalogu, abyś mógł zrobić coś takiego, jak config/initializers/extensions/*.rb.

7

Staram się, aby te małpie łatki były jak najmniejsze, tylko wtedy, gdy są bardzo wyraźnie w najlepszym interesie mojego kodu.

Ostatnio wolałem zachować pliki zorganizowane w folderach takich jak lib/monkey/string.rb, lib/monkey/hash.rb itd. Wymagam następnie wszystkich plików w folderze lib/monkey w moim środowisku. plik rb.

# Load all monkey-patches. 
Dir["lib/monkey/*.rb"].each {|monkeyfile| require monkeyfile} 

Dzięki temu cały kod modyfikujący moją klasę zostanie odizolowany w jednym miejscu, jeśli wystąpi problem. Podoba mi się również nieco głupkowate nazywanie, ponieważ sprawia, że ​​wyróżnia się jako coś, o czym należy pamiętać. Ktoś może mieć lepszy system, jeśli tak ... Chciałbym o tym usłyszeć!

+2

Dlaczego nie użyłbyś katalogu inicjalizującego? Robi to, co tu robisz. – ryeguy

+0

Będę musiał rozważyć użycie inicjalizatorów, ale wydaje mi się, że jest mi trochę krzywdzić robienie czegoś tak dużego, jak modyfikowanie domyślnych klas w ścieżce inicjalizatorów. – Alex

+1

Jaka jest różnica? Musiałbyś umieścić swój kod w pliku środowiska i byłby uruchamiany, gdy framework i tak się uruchomi. Pytanie tutaj brzmi, czy chcesz użyć czegoś wbudowanego w Rails, czy też chcesz zaimplementować dokładnie to samo. Nadal można utworzyć katalog o nazwie inicjatory "małpa", jeśli chcesz. Nie trzeba wymyślać koła. – ryeguy

Powiązane problemy