Konsola Railsów: przeładuj! nie odzwierciedla zmian w plikach modelu? Jaki może być możliwy powód?

95

Wcześniej działało dobrze. Grałem trochę w config. Może więc nieświadomie zmieniłem konfigurację.

tutaj jest konfiguracja environment / development.rb

  config.cache_classes = false

  # Log error messages when you accidentally call methods on nil.
  config.whiny_nils = true

  # Show full error reports and disable caching
  config.consider_all_requests_local       = true
  config.action_view.debug_rjs             = true
  config.action_controller.perform_caching = false

  # Don't care if the mailer can't send
  config.action_mailer.raise_delivery_errors = false

  # Print deprecation notices to the Rails logger
  config.active_support.deprecation = :log

  # Only use best-standards-support built into browsers
  config.action_dispatch.best_standards_support = :builtin

  # migration prefix with sequence #s
  config.active_record.timestamped_migrations = false

  #time zone
  config.time_zone = 'UTC'

Oto sekcja konfiguracji pliku application.rb

 # Configure the default encoding used in templates for Ruby 1.9.
 config.encoding = "utf-8"

 # Configure sensitive parameters which will be filtered from the log file.
 config.filter_parameters += [:password]

 config.active_record.schema_format = :sql

kiedy uruchomię przeładowanie! na konsoli rails zwraca prawdę

Maddy.Shik
źródło

Odpowiedzi:

181

reload!tylko ponownie ładuje najnowszy kod w środowisku konsoli. Nie powoduje ponownej inicjalizacji istniejących obiektów.

Oznacza to, że jeśli utworzyłeś już wystąpienie jakichkolwiek obiektów, ich atrybuty nie zostaną zaktualizowane - w tym nowo wprowadzone walidacje. Jeśli jednak utworzysz nowy obiekt, jego atrybuty (a także walidacje) będą odzwierciedlać ponownie załadowany kod. więcej tutaj

Nazar Hussain
źródło
A co z niestandardową weryfikacją? Zdefiniowałem kilka metod i zarejestrowałem się w validate. Kiedy zmieniam logikę walidacji, nie jest to odzwierciedlane po ponownym załadowaniu !.
Maddy.Shik
2
Będzie to odzwierciedlać, gdy ponownie zainicjujesz obiekt.
Nazar Hussain,
19

Czy przeładowujesz obiekt z bazy danych?

Na przykład:

>> a = User.last
=> #<User id: 16, email: "[email protected]">
>> reload!
Reloading...
=> true

„a” nie będzie odzwierciedlać żadnych zmian w modelu, dopóki nie załadujesz go ponownie z bazy danych.

ctide
źródło
1
Uwaga - jest to prawdą nawet podczas uzyskiwania dostępu do metody na obiekcie. Na przykład, jeśli zmienisz definicję metody klasy foo (), to w konsoli a.foo nie użyje nowej definicji, chyba że najpierw przeładujesz plik.
jpw