2010-10-25 2 views
14

ПОЛОЖЕНИЕ:Rails3 не перегрузочные код в Lib в режиме разработки

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

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

    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"] 
    

ПРОБЛЕМА :

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

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

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

Спасибо!

ответ

9

Сняли 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 должен быть автоматически загружен и впоследствии перезагружен каждый запрос.

+0

Спасибо за ответ Самуил! Разве я не использую ваше первое предложение? Должен ли я использовать оператор '<<' вместо fo '+ ='? Я думал, что они эквивалентны. – John

+0

Для вашей цели они одинаковы. Разница заключается в том, что вы хотите, чтобы 'lib' был автоматически загружен, чтобы он мог найти исходный файл' foo/bar.rb' для константы 'Foo :: Bar'. – Samuel

+0

Я обновил раздел «СИТУАЦИЯ» своего сообщения, чтобы было легче разобрать. См. Часть 4. – John

-1

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

Что-то вроде этого:

require `bar` 

module FooBarHelper 

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

end 

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

+0

Спасибо для ответа Макс! Ценить это! Итак, как вы предлагаете мне доступ к классу Bar? – John

+0

Я обновил свой ответ выше, это работает для вас с перезагрузкой? –

+0

Нет костей на моем конце ... это сработало для вас? – John

2

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

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

config.autoload_paths += %W(#{config.root}/lib) 
25

Предыдущие ответы не работает. Вот работает один: 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' просто чувствовала себя грязной. – Patrick

+0

Спасибо за ваш ответ, Майк. Проблема в том, что первый ответ был дан в то время, когда Rails 3.1 был доступен. Тем не менее, я признаю, что ваш ответ также верен. Я дал вам голосование, но, возможно, вы могли бы создать новый вопрос для Rails> 3.2 и ответить на него самостоятельно. – John

+1

Я поместил 'config.watchable_dirs ['lib'] = [: rb]' в development.rb, а в моем контроллере я использовал 'require_dependency 'my_folder \ my_class' 'для ссылки на мой класс в' lib \ my_folder \ my_class'. Подробнее см. Http://apidock.com/rails/v3.2.8/ActiveSupport/Dependencies/Loadable/require_dependency. –

Смежные вопросы