Rails3 не перезагружает код в lib в режиме разработки
СИТУАЦИЯ:
-
У меня есть код в lib/foo/bar.rb
с простым методом, определенным как таковой:
module Foo
class Bar
def test
"FooBar"
end
end
end
-
В моем помощнике FooBarHelper
у меня есть:
require `lib/foo/bar`
module FooBarHelper
def test_foo_bar
fb = Foo::Bar.new
fb.test
end
end
-
На мой взгляд, я называю этот вспомогательный метод следующим:
<%= test_foo_bar =>
-
В моем config/environments/development.rb
я добавил каталог в свой config.autoload_paths
:
config.autoload_paths += ["#{config.root}/lib/foo"]
ПРОБЛЕМА:
Когда я меняю возвращаемое значение Foo::Bar.test
на, например, "MODIFIED FOOBAR"
, исходное возвращаемое значение "FooBar"
все еще отображается на представлении, а не на новом значении.
Так как я в режиме разработки, не должен ли код перезагрузить код по каждому запросу?
Может ли кто-нибудь сказать мне, что мне не хватает?
Спасибо!
Ответы
Ответ 1
Они удалили папку lib
корнем приложения в Rails 3.
Вы можете добавить его обратно
config.autoload_paths << 'lib'
или вы можете использовать `require_dependency` в своем помощнике.
module FooBarHelper
require_dependency 'foo/bar'
def test_foo_bar
fb = Foo::Bar.new
fb.test
end
end
Оба способа указывают Rails, что ваш файл lib/foo/bar.rb
должен быть автоматически загружен и впоследствии перезагружен каждый запрос.
Ответ 2
Предыдущие ответы не работают. Вот рабочий: http://ileitch.github.com/2012/03/24/rails-32-code-reloading-from-lib.html
Вы должны использовать оба:
config.watchable_dirs['lib'] = [:rb]
и
require_dependency
но любое решение на основе config.autoload_paths
не будет работать в Rails ~ > 3.2
Ответ 3
Автозагрузка код из Lib папки намеренно отключена в rails3, посмотреть ticket для более подробной информации.
Обходной предложил Самуилом отличный старт, но я обнаружил, что некоторые среды до сих пор было трудно найти библиотеки в среде тестирования (скажем, будучи вызван из сценария огурца), и в том числе корневой путь, как это было предложено в рамках ticket и намекнул исходный комментарий в приложении .rb был более надежным:
config.autoload_paths += %W(#{config.root}/lib)
Ответ 4
Почему вы вставляете требование в модуль, при использовании autoload_path вам не нужно вообще требовать файл, он должен работать без него, я думаю, что если вы вручную потребуете файл впоследствии, рельсы не знают, когда загружать это снова?
Что-то вроде этого:
require `bar`
module FooBarHelper
def test_foo_bar
fb = Foo::Bar.new
fb.test
end
end
должен работать, нет необходимости в требовании внутри вашего модуля.