已禁用/自定义params_parser每个操作

时间:2009-10-26 20:59:18

标签: ruby-on-rails xml parsing nokogiri params

我有一个处理XML请求的创建操作。我使用Nokogiri来根据XML模式验证XML,而不是使用内置的params哈希。如果此验证通过,则存储原始XML以供稍后处理。

据我所知,XML被解析两次:首先Rails创建params散列,然后Nokogiri解析发生。我一直在寻找方法来禁用params解析以加快速度但却一无所获。

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

我知道可以使用类似上面的内容自定义XML params解析,但我依赖于其他控制器中的默认行为。

是否有可能在每个动作的基础上绕过params解析?我有什么选择?

感谢您的帮助!

1 个答案:

答案 0 :(得分: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的Naive基准测试显示标准Rails每秒请求22.62次,而Metal版本每秒请求57.60次。