Rails3 nie przeładowuje kodu w lib w trybie deweloperskim

SYTUACJA:

  1. Mam kod w lib/foo/bar.rb z prostą metodą zdefiniowaną jako taka:

    module Foo
      class Bar
        def test
          "FooBar"
        end
      end
    end
    
  2. W moim pomocniku, FooBarHelper, mam:

    require `lib/foo/bar`
    module FooBarHelper
      def test_foo_bar
        fb = Foo::Bar.new
        fb.test
      end
    end
    
  3. Moim zdaniem metodę pomocniczą nazywam tak:

    <%= test_foo_bar =>
    
  4. W moim config/environments/development.rb dodałem katalog do mojego config.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!

Author: John, 2010-10-26

4 answers

Usunęli lib folder główny aplikacji w Rails 3.

Możesz go dodać z powrotem
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.

 9
Author: Samuel,
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

 25
Author: Mike Aski,
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)
 2
Author: Clinton,
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.

 -1
Author: Max Schulze,
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