2010-05-07 5 views
4

J'essaye de construire des URL au format http://servername/find/by/CRITERION/VALUEFin d'un Rails 2 URL avec une adresse IP provoque une erreur de routage?

CRITERION est un ensemble fini de chaînes, comme VALUE. Le problème est, VALUE doit être une adresse IP dans certaines situations, et cela me cause une erreur de routage.

Voici mon itinéraire:

map.find 'find/by/:criterion/:query', :controller => "find", :action => "by" 

Et l'erreur, à partir des journaux Mongrel:

Processing ApplicationController#index (for 127.0.0.1 at 2010-05-07 10:20:32) [GET] 
ActionController::RoutingError (No route matches "/find/by/ip/1.2.3.4" with {:method=>:get}): 
Rendering rescues/layout (not_found) 

Si je visite/find/par/foo/bar ou/trouver/par/foo/1234 Je n'ai pas de problèmes. Je soupçonne que le problème pourrait être l'inférence de Rails des types MIME basés sur des périodes dans l'URL, mais je ne sais pas vraiment comment je peux désactiver cela. J'ai essayé de passer a: defaults => {: format =>: html} à la route mais cela ne permet pas à Mongrel de démarrer complètement.

Toute aide appréciée!

Répondre

5

Route globbing travaillé!

Mon itinéraire est maintenant:

map.connect 'find/by/*query', :controller => "find", :action => "by" 

Cela met tout ce qui suit/trouver/par/dans un tableau, params [: requête], un segment d'URL par objet tableau. Pour la /find/by/ip/1.2.3.4 de requête, cela ressemble à:

["ip", "1.2.3.4"] 

donc je peux juste faire référence à params [: requête] [0] et [params: requête] [1].

Si quelqu'un a une meilleure façon de le faire, s'il vous plaît le poster!

+0

J'ai vraiment aimé cette solution. Va jouer la question. Cela pourrait être utile plus tard. :) Merci pour cela. –

+1

Assurez-vous dans votre contrôleur que vous utilisez les meilleures pratiques pour params [: query] afin d'éviter une attaque par injection SQL. Dans ce cas, je m'assurerais que le paramètre est en fait une adresse IP. 'require 'ipaddr'; IPAddr.new params [: query] 'IPAddr soulèvera une 'ArgumentError: adresse invalide' si le paramètre n'est pas une adresse IP. – scarver2

Questions connexes