0

XML 要求を処理する作成アクションがあります。組み込みの params ハッシュを使用するのではなく、Nokogiri を使用して XML スキーマに対して XML を検証します。この検証に合格すると、後で処理するために生の XML が保存されます。

私が理解している限り、XML は 2 回解析されます。最初に Rails が params ハッシュを作成し、次に Nokogiri 解析が行われます。速度を上げるためにパラメーターの解析を無効にする方法を探していましたが、何も見つかりませんでした。

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

上記のようなものを使用して、XML パラメータの解析全般をカスタマイズできることはわかっていますが、他のコントローラのデフォルトの動作に依存しています。

アクションごとにパラメーター解析をバイパスすることは可能ですか? どのようなオプションがありますか?

ご協力ありがとうございました!

4

1 に答える 1

2

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

ありがとう!

PS: 開発中の Apache Bench を使用した単純なベンチマークでは、標準 Rails の 1 秒あたりのリクエスト数が 22.62 であるのに対し、Metal バージョンの 1 秒あたりのリクエスト数は 57.60 です。

于 2009-10-27T14:37:37.660 に答える