Rails3 nie przeładowuje kodu w lib w trybie deweloperskim
SYTUACJA:
-
Mam kod w
lib/foo/bar.rb
z prostą metodą zdefiniowaną jako taka:module Foo class Bar def test "FooBar" end end end
-
W moim pomocniku,
FooBarHelper
, mam:require `lib/foo/bar` module FooBarHelper def test_foo_bar fb = Foo::Bar.new fb.test end end
-
Moim zdaniem metodę pomocniczą nazywam tak:
<%= test_foo_bar =>
-
W moim
config/environments/development.rb
dodałem katalog do mojegoconfig.autoload_paths
:config.autoload_paths += ["#{config.root}/lib/foo"]
PROBLEM:
Gdy zmienię wartość zwracaną Foo::Bar.test
na, na przykład, "MODIFIED FOOBAR"
, oryginalna wartość zwracana, "FooBar"
, jest nadal wyświetlana w widoku, a nie Nowa wartość.
Ponieważ jestem w trybie deweloperskim, czy kod nie powinien przeładowywać kodu na każde żądanie?
Czy ktoś mógłby mi powiedzieć, co mi umyka?
Dzięki!
4 answers
Usunęli lib
folder główny aplikacji w Rails 3.
config.autoload_paths << 'lib'
możesz też użyć "require_dependency"w helperze.
module FooBarHelper
require_dependency 'foo/bar'
def test_foo_bar
fb = Foo::Bar.new
fb.test
end
end
Oba sposoby mówią Rails, że Twój plik lib/foo/bar.rb
powinien być automatycznie ładowany, a następnie przeładowywany przy każdym żądaniu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-26 02:54:01
Poprzednie odpowiedzi nie działają. Oto działa: http://ileitch.github.com/2012/03/24/rails-32-code-reloading-from-lib.html
Musisz użyć obu:
config.watchable_dirs['lib'] = [:rb]
I
require_dependency
Ale jakiekolwiek rozwiązanie oparte naconfig.autoload_paths
nie zadziała w Rails ~> 3.2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-02 16:58:16
Automatyczne ładowanie kodu z folderu lib zostało celowo wyłączone w rails3, zobacz ten bilet Po Więcej Szczegółów.
Obejście zaproponowane przez Samuela jest świetnym początkiem, jednak odkryłem, że niektóre środowiska nadal miały problemy ze znalezieniem bibliotek w środowisku testowym (powiedzmy, że są wywoływane ze scenariusza ogórka), a także ze ścieżką główną, jak sugerowano w bilecie i sugerowano przez oryginalny komentarz w aplikacji.rb był bardziej wytrzymały podejście:
config.autoload_paths += %W(#{config.root}/lib)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-24 05:09:05
Dlaczego umieszczasz require w module, podczas korzystania z autoload_path nie powinieneś w ogóle wymagać pliku, powinien on działać bez, myślę, że jeśli ręcznie wymagasz pliku później, rails nie wie, kiedy go załadować ponownie?
Coś takiego:
require `bar`
module FooBarHelper
def test_foo_bar
fb = Foo::Bar.new
fb.test
end
end
Powinno działać, nie ma potrzeby posiadania wymaganego w module.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-26 02:32:39