2012-01-20 18 views
10

Tengo rutas como las siguientes para eliminar/listar un usuario.Cómo codificar (.) Punto en 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 

Mientras lista el usuario mediante la codificación de la Dot con 2E%, puedo ver la respuesta de éxito

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

Pero Al tratar de eliminar el usuario que contiene el punto (.), Tiros de error 404 .

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

Respuesta

2

El punto no está permitido por defecto en los carriles de enrutamiento debido a que el punto se considera la extensión de la página. Debe evitar el uso de puntos en las URL.

Sin embargo, en su caso puede indicar a Rails que considere el punto para el parámetro :user_name pasando una expresión regular.

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

PS. Debido a map.connect, está utilizando una versión muy antigua de Rails (Rails < 3). Debe actualizar su aplicación.

0

¿Estás haciendo una solicitud DELETE a la URL de eliminación? Tenga en cuenta que la ruta se define con :method=>:delete, por lo que espera la solicitud DELETE (no GET).

+0

También eliminé el método de eliminación y luego intenté pero no tuve suerte – loganathan

18

Avdi Grimm escribió sobre este tema: 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/

usted querrá hacer algo como esto (el crédito a Avdi)

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

Un comentarista en el post dice que también puede hacer:

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

El comentarista tenía razón;) –

+1

+1 'recursos: usuarios,: id => /.*/' funciona –

+2

Eso no cuenta si tiene otra/en la url, como '/ search/hello + world/page/20'. Sería mejor ir con todo menos a/con '/ [^ /] + /' – Tallboy

7

Acabo de tener un problema similar, mi página de búsqueda url es/search/search_term. Cuando search_term tenía un punto, Rails lo interpretó como el formato de solicitud. Si traté de buscar book.html, realmente busqué el libro, porque Rails interpretó html como el formato. Un formato no reconocido devolvería un error.

En mi caso, la primera solución de Avdi Grimm no funcionó, porque mi búsqueda está paginada, y el número de página también aparece en la url (/ search/book/2). La solución para mí fue aceptar todo menos una barra para search_term (la última solución de la publicación de Avdi Grimm):

recursos: users,: constraints => {: id =>/[^ \ /] + /}

+1

Me gusta mejor tu respuesta, aunque creo que debería ser '/ [^ \ /] + /' – Tallboy

+0

Gracias, de hecho escribí el barra invertida, pero no apareció en la página. Tuve que escribir 2 barras diagonales inversas para mostrar 1. –

Cuestiones relacionadas