在开发模式下,Rails3不会在lib中重新加载代码

Joh*_*ohn 14 ruby-on-rails autoload ruby-on-rails-3

情况:

  1. lib/foo/bar.rb用一个定义如下的简单方法编写代码:

    module Foo
      class Bar
        def test
          "FooBar"
        end
      end
    end
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在我的帮手中FooBarHelper,我有:

    require `lib/foo/bar`
    module FooBarHelper
      def test_foo_bar
        fb = Foo::Bar.new
        fb.test
      end
    end
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在我看来,我称之为辅助方法如下:

    <%= test_foo_bar =>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在我config/environments/development.rb,我将目录添加到我的config.autoload_paths:

    config.autoload_paths += ["#{config.root}/lib/foo"]
    
    Run Code Online (Sandbox Code Playgroud)

问题:

Foo::Bar.test例如,当我更改to 的返回值时,"MODIFIED FOOBAR"原始返回值"FooBar"仍然显示在视图上而不是新值.

由于我处于开发模式,代码不应该在每个请求上重新加载代码吗?

有人能告诉我我错过了什么吗?

谢谢!

Mik*_*ski 25

以前的答案不起作用.这是一个有效的工作:http://ileitch.github.com/2012/03/24/rails-32-code-reloading-from-lib.html

你必须使用两者:

config.watchable_dirs['lib'] = [:rb]
Run Code Online (Sandbox Code Playgroud)

require_dependency
Run Code Online (Sandbox Code Playgroud)

但任何config.autoload_paths基于解决方案都不适用于Rails~> 3.2

  • 我绝对认为这应该是公认的解决方案.我花了最后半小时搜索这个,因为自动加载整个`lib`目录只是感觉很脏. (3认同)

Sam*_*uel 9

他们删除了libRails 3中app根的文件夹.

您可以将其添加回来
config.autoload_paths << 'lib'
Run Code Online (Sandbox Code Playgroud) 或者您可以在助手中使用`require_dependency`.
module FooBarHelper
  require_dependency 'foo/bar'

  def test_foo_bar
    fb = Foo::Bar.new
    fb.test
  end
end
Run Code Online (Sandbox Code Playgroud)

两种方式都告诉Rails您的文件lib/foo/bar.rb应该自动加载,然后重新加载每个请求.