在我的 rails 应用程序中,我在 lib 中有一个文件,除其他外,它设置了一个在所有控制器上运行的过滤器。
在开发环境下运行时,一切正常。但是,在生产过程中,过滤器丢失了。有趣的是,通过检查filter_chain
,我注意到其他过滤器仍然存在,例如。那些在插件中定义的,或者稍后在特定控制器类中定义的。
我已经用 rails edge 和 v2.3.0 对此进行了测试。
测试更新:
我现在已经用旧的导轨进行了测试,发现问题出现在 v2.1.0 中,但在 v2.0.5 中没有,我将它们一分为二,发现986aec5导轨是有罪的。
我已将行为隔离到以下小测试用例:
# 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
,则测试应用程序正常工作。
我仍然想知道为什么类重新加载会导致这样的事情。