Отключено / Пользовательский params_parser для каждого действия - PullRequest
0 голосов
/ 26 октября 2009

У меня есть действие create, которое обрабатывает запросы XML. Вместо использования встроенного хэша params я использую Nokogiri для проверки XML на соответствие схеме XML. Если эта проверка пройдена, необработанный XML сохраняется для последующей обработки.

Насколько я понимаю, XML анализируется дважды: сначала Rails создает хэш параметров, затем происходит анализ Nokogiri. Я искал способы отключить разбор параметров, чтобы ускорить процесс, но ничего не нашел.

ActionController::Base.param_parsers[Mime::XML] = lambda do |body|
  # something
end

Я знаю, что в целом можно настроить синтаксический анализ XML-параметров, используя что-то подобное, но я зависел от поведения по умолчанию в других контроллерах.

Можно ли обойти анализ параметров для каждого действия? Какие варианты у меня есть?

Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 27 октября 2009

Мне удалось решить проблему с помощью Rails Metal. Соответствующая часть выглядит примерно так:

class ReportMetal
  def self.call(env) 
    if env["PATH_INFO"] =~ /^\/reports/
      request = Rack::Request.new(env)
      if request.post?
        report = Report.new(:raw_xml => request.body.string)
        if report.save # this triggers the nokogiri validation on raw_xml
          return [201, { 'Content-Type' => 'application/xml' }, report.to_xml]
        else
          return [422, { 'Content-Type' => 'application/xml' }, report.errors.to_xml]
        end
      end
    end
    [404, { "Content-Type" => "text/html" }, "Not Found."]
  ensure
    ActiveRecord::Base.clear_active_connections!
  end
end

Спасибо! * * 1004

PS: Наивный сравнительный анализ с Apache Bench в разработке показывает 22,62 запросов в секунду для стандартных Rails против 57,60 запросов в секунду для версии Metal.

...