Rails3 не перезагружает код в lib в режиме разработки - PullRequest
14 голосов
/ 26 октября 2010

СИТУАЦИЯ:

  1. У меня есть код в lib/foo/bar.rb с простым методом, определенным так:

    module Foo
      class Bar
        def test
          "FooBar"
        end
      end
    end
    
  2. В моем помощнике, FooBarHelper, у меня есть:

    require `lib/foo/bar`
    module FooBarHelper
      def test_foo_bar
        fb = Foo::Bar.new
        fb.test
      end
    end
    
  3. На мой взгляд, я вызываю этот вспомогательный метод следующим образом:

    <%= test_foo_bar =>
    
  4. В моем config/environments/development.rb я добавил каталог в свой config.autoload_paths:

    config.autoload_paths += ["#{config.root}/lib/foo"]
    

ПРОБЛЕМА:

Когда я изменяю возвращаемое значение Foo::Bar.test, например, "MODIFIED FOOBAR", исходное возвращаемое значение "FooBar" все еще отображается в представлении, а не новое значение.

Поскольку я нахожусь в режиме разработки, не должен ли код перезагружать код при каждом запросе?

Может кто-нибудь сказать мне, что мне не хватает?

Спасибо!

Ответы [ 4 ]

25 голосов
/ 25 апреля 2012

Предыдущие ответы не работают. Вот рабочий: 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

9 голосов
/ 26 октября 2010

Они удалили папку 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 голосов
/ 24 ноября 2010

Автозагрузка кода из папки lib была намеренно отключена в rails3, подробнее см. Этот тикет .

Обход, предложенный Сэмюэлем, является отличным началом, однако я обнаружил, что в некоторых средах все еще возникают трудности с поиском библиотек в среде тестирования (например, при вызове из сценария с огурцом) и что в том числе с корневым путем, как предлагается в тикет и намекает оригинальный комментарий в application.rb был более надежный подход:

config.autoload_paths += %W(#{config.root}/lib)
0 голосов
/ 26 октября 2010

Почему вы помещаете require в модуль, при использовании autoload_path вам не нужно вообще запрашивать файл, он должен работать без, я думаю, если вы потом вручную запрашиваете файл, rails не знает, когда загрузить это снова?

Примерно так:

require `bar`

module FooBarHelper

  def test_foo_bar
    fb = Foo::Bar.new
    fb.test
  end

end

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

...