2009-10-26 11 views
0

J'ai une action de création qui gère les requêtes XML. Plutôt que d'utiliser le hachage params intégré, j'utilise Nokogiri pour valider le XML par rapport à un schéma XML. Si cette validation réussit, le XML brut est stocké pour un traitement ultérieur. Pour autant que je sache, le XML est analysé deux fois: d'abord, le Rails crée le hash params, puis l'analyse Nokogiri se produit. J'ai cherché des façons de désactiver l'analyse params pour accélérer les choses, mais n'ont rien trouvé.Disabled/Custom params_parser per action

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

Je sais qu'il est possible de personnaliser les params XML d'analyse syntaxique en général en utilisant quelque chose comme ce qui précède, mais je dépends sur le comportement par défaut dans d'autres contrôleurs.

Est-il possible de contourner l'analyse des paramètres sur une base par action? Quelles options ai-je?

Nous vous remercions de votre aide!

Répondre

2

J'ai réussi à résoudre le problème en utilisant Rails Metal. La partie pertinente ressemble à ceci:

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 

Merci! PS: L'analyse comparative naïve avec Apache Bench en développement montre 22,62 requêtes par seconde pour les routeurs standard contre 57,60 requêtes par seconde pour la version Metal.

+0

Cela ressemble à ce dont j'ai besoin :) Merci! –

+0

Confirmé - ça marche - merci encore! –