2012-06-27 9 views
15

Zajmuję się zawieszaniem konsoli Railsów i znajduję ją przydatną do szybkiego testowania metod na moich zajęciach. Wiem, że mogę dokonać zmian w moich modeli, a następnieJakie są powody "przeładuj!" nie zawsze działa w konsoli Rails?

> reload! 

aby pobrać te aktualizacje, ale czasem znajdę to, że nie wydaje się, aby przeładować mój najnowszy kod. Czy gdzieś w Railsach jest jakiś kod pamięci podręcznej?

w bardzo prosty przykład pseudo, może mam zły kod na linii 100:

100: u = User.alll 

aw konsoli Rails, kiedy uruchomić ten sposób, że mogę się błąd podobny do:

NoMethodError: undefined method `alll' for User:Class ... on line 100 

następnie zmodyfikować mój kod, ustalenie błędu

100: u = User.all 

następnie przeładować:

> reload! 

a następnie, gdy wywołanie metody w tej klasie, który ma prawidłowy kod, to nadal będzie powiedzieć

NoMethodError: undefined method `alll' for User:Class ... on line 100 

Kiedy wyraźnie, błąd jest ustalona, ​​a linia nie jest jeszcze wykraczająca na linii 100 już. Czy istnieje sposób na wymuszenie/trudne resetowanie "przeładowania!" dowództwo?

Odpowiedz

22

Moje przypuszczenie byłoby, że robisz coś takiego:

  1. Utwórz instancję User
  2. Wezwania someMethod na przykład
  3. pojawi się błąd, a ty idź i go naprawić
  4. reload!
  5. zadzwonić someMethodna istniejącej instancji i uzyskaj ponownie błąd

Wywołujesz metodę dla instancji, która nie została ponownie załadowana. Jego klasa została przeładowana, ale instancja jest już w pamięci - z błędami i wszystkimi.

To byłoby moje przypuszczenie przynajmniej (nie w 100% pewne).

Jeśli tworzysz nową instancję po i wywołujesz metodę na tej nowej instancji, powinna przestać narzekać.

+0

Tak, to był dokładnie problem. Utworzone wystąpienia nie "ładują się ponownie". Po ponownym wczytaniu! -ing i ponownym tworzeniu instancji, rzeczy działają świetnie za każdym razem. Dzięki @flambino – jbnunn