我有一个处理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解析?我有什么选择?
感谢您的帮助!
答案 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次。