私の Rails アプリケーションでは、lib にファイルがあり、とりわけ、すべてのコントローラーで実行されるフィルターを設定します。
開発環境で実行すると、すべて正常に動作します。ただし、生産中はフィルターがなくなります。面白いことに、 を調べると、filter_chain
他のフィルターが残っていることに気付きました。プラグインで定義されたもの、または後で特定のコントローラー クラスで定義されたもの。
Rails Edge と v2.3.0 の両方でこれをテストしました。
テストの更新:
古いレールでテストしたところ、v2.1.0 に戻って問題が発生していることがわかりましたが、v2.0.5 では発生していません。
この動作を次の小さなテスト ケースに分離しました。
# app/controllers/foo_controller.rb
class FooController < ApplicationController
def index
render :text => 'not filtered'
end
end
# lib/foobar.rb
ActionController::Base.class_eval do
before_filter :foobar
def foobar
render :text => 'hi from foobar filter'
end
end
# config/environment.rb (at end of file)
require 'foobar'
開発環境で実行したときに得られる出力は次のとおりです。
$ script/server &
$ curl localhost:3000/foo
> hi from foobar filter
そして、本番環境の出力は次のとおりです。
$ script/server -e production &
$ curl localhost:3000/foo
> not filtered
前にほのめかしたように、プラグインを介して同じことを行うと、どの環境でも問題なく動作します。lib/foobar.rb
必要なのは、プラグインのinit.rb
ファイルの下にあるものを入れることだけです。
ある意味で、私はすでに回避策を持っていますが、何が起こっているのか、本番環境でフィルターが失われる原因を理解したいと思っています。
これは、Rails がさまざまな環境でロードを処理するさまざまな方法によるものだと推測しますが、さらに深く掘り下げる必要があります。
アップデート
実際、次の構成行に絞り込みました。
config.cache_classes = false
production.rb
の が からにconfig.cache_classes
変更されtrue
た場合false
、テスト アプリケーションは正常に動作します。
クラスのリロードがなぜそのようなことを引き起こしているのか、私はまだ疑問に思っています。