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

должен работать, нет необходимости в требовании внутри вашего модуля.