14

状況:

  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. myconfig/environments/development.rbで、ディレクトリを my に追加しましたconfig.autoload_paths

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

問題:

Foo::Bar.testたとえば、の戻り値を に変更すると、新しい値ではなく"MODIFIED FOOBAR"、元の戻り値"FooBar"が引き続きビューに表示されます。

私は開発モードにいるので、コードはリクエストごとにコードをリロードするべきではありませんか?

誰かが私に欠けているものを教えてもらえますか?

ありがとう!

4

4 に答える 4

25

Previous answers does not work. Here is a working one: http://ileitch.github.com/2012/03/24/rails-32-code-reloading-from-lib.html

You have to use both:

config.watchable_dirs['lib'] = [:rb]

and

require_dependency

but any config.autoload_paths based solution won't work in Rails ~> 3.2

于 2012-04-25T13:20:24.053 に答える
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を自動読み込みし、その後各リクエストを再読み込みするように指示します。

于 2010-10-26T02:54:01.077 に答える
2

lib フォルダーからのコードの自動ロードは、rails3 で意図的に無効にされました。詳細については、このチケットを参照してください。

サミュエルによって提案された回避策は素晴らしいスタートですが、チケット内で提案され、示唆されているように、特定の環境ではテスト環境でライブラリを見つけるのが依然として困難であることがわかりました (たとえば、キュ​​ウリのシナリオから呼び出された場合など)。application.rb の元のコメントによると、より堅牢なアプローチでした。

config.autoload_paths += %W(#{config.root}/lib)
于 2010-11-24T05:09:05.110 に答える
-1

モジュールにrequireを入れているのはなぜですか?

このようなもの:

require `bar`

module FooBarHelper

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

end

モジュール内に require を入れる必要はありません。

于 2010-10-25T23:07:40.733 に答える