В моем приложении rails у меня есть файл в lib, который, помимо прочего, устанавливает фильтр, который работает на всех контроллерах.
При работе в среде разработки все работает нормально. Однако при производстве фильтр пропадает. Забавно, что, осмотрев filter_chain
, я заметил, что остались другие фильтры, например. определенные в плагинах, или позже в определенном классе контроллера.
Я проверил это как с краями рельсов, так и с 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'
Вот вывод, который я получаю при работе в среде development :
$ script/server &
$ curl localhost:3000/foo
> hi from foobar filter
А вот вывод для production environment:
$ 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
, тестовое приложение работает правильно.
Я все еще удивляюсь, почему перезагрузка классов вызывает такую вещь.