2012-01-20 9 views
10

Ho percorsi come quelli qui sotto per eliminare/elencare un utente.Come codificare (.) Dot in url Rails

map.connect 'developer/:user_name/delete',:controller=>"developers",:action=>"delete",:method=>:delete 

map.connect 'developer/:user_name/list',:controller=>"developers",:action=>"list",:method=>:get 

Mentre messa in vendita l'utente codificando il Dot con% 2E, posso vedere la risposta di successo

http://localhost:3000/developer/testuser%2Ehu/list 

Ma Durante il tentativo di eliminare l'utente che contiene il punto (.), Getta errore 404 .

http://localhost:3000/developer/testuser%2Ehu/delete, how to fix this issue. 

risposta

2

Il punto non è consentito per impostazione predefinita nell'instradamento di Rails perché il punto è considerato l'estensione della pagina. Evita di usare punti negli URL.

Tuttavia, nel tuo caso puoi indicare a Rails di considerare il punto per il parametro :user_name che passa un'espressione regolare.

map.connect 'developer/:user_name/list', :controller => "developers", :action => "list", :method=> :get, :user_name => /[\w.]+/ 

PS. A causa di map.connect, si utilizza una versione molto vecchia di Rails (Rails < 3). Dovresti aggiornare la tua applicazione.

0

Stai facendo una richiesta DELETE all'URL di eliminazione? Si noti che il percorso è definito con :method=>:delete, quindi si aspetta la richiesta DELETE (non GET).

+0

Ho anche rimosso il metodo delete e quindi ho provato ma senza fortuna – loganathan

18

Avdi Grimm ha scritto su questo argomento: http://avdi.org/devblog/2010/06/18/rails-3-resource-routes-with-dots-or-how-to-make-a-ruby-developer-go-a-little-bit-insane/

Avrai voglia di fare qualcosa di simile (pieno credito a Avdi)

resources :users, :constraints => { :id => /.*/ } do 
    resources :projects 
    end 

Un commentatore sul palo dice che si può anche fare:

resources :users, :id => /.*/ 
+0

Il commentatore aveva ragione;) –

+1

+1 'risorse: users,: id => /.*/' funziona –

+2

Questo non conta se ne hai un altro/nell'URL, come '/ search/hello + world/page/20'. Potrebbe essere meglio andare con tutto tranne un/con '/ [^ /] + /' – Tallboy

7

Ho appena avuto un problema simile, l'URL della mia pagina di ricerca è/search/search_term. Quando search_term aveva un punto, Rails lo interpretava come il formato della richiesta. Se ho provato a cercare book.html, in realtà ho cercato il libro, perché Rails ha interpretato HTML come formato. Un formato non riconosciuto restituirebbe un errore.

Nel mio caso, la prima soluzione di Avdi Grimm non ha funzionato, perché la mia ricerca è impaginata, e il numero di pagina va anche nell'URL (/ search/book/2). La soluzione per me era accettare tutto tranne una barra per il search_term (l'ultima soluzione dal post di Avdi Grimm):

risorse: utenti,: vincoli => {: id =>/[^ \ /] + /}

+1

Mi piace la tua risposta migliore, anche se penso che dovrebbe essere '/ [^ \ /] + /' – Tallboy

+0

Grazie, ho effettivamente digitato il backslash, ma non era visibile nella pagina. Ho dovuto digitare 2 backslash per mostrare 1. –