Escapando strings que contienen URLs

Hola a todos,

Tengo un modelo donde uno de sus atributos es un String que guarda una
URL.
Quiero hacer búsquedas por este String, así que en mi aplicación puedo
tener un enlace apuntando a:
/bugs/by/uri/{value},
donde “value” puede ser: /whatever.net/bla/bla

Cuando te sitúas sobre el link, ves que ese link se ha convertido en:
http://localhost:3005/bugs/by/uri/%2Fwhatever.net%2Bla%2Bla
así que piensas que todo va a ir bien, pero no; al hacer click en él las
barras aparecen y da error:
no route found to match “/sdrs/by/uri//whatever.net/bla/bla” with
{:method=>:get}

Asi que la pregunta es: ¿Hay algún método para escapar las “/” (y
posiblemente los puntos también ‘.’) de manera automática?

URI.scape no hace nada, no escapa las barras.

Podría hacer algún tipo de sustitución con gsub, pero no sé con qué
carácter puedo escapar esas barras, porque el String puede tener
cualquier caracter extraño también, supongo.

Gracias.

On Jan 11, 2008, at 1:42 PM, Damaris F. wrote:

las
cualquier caracter extraño también, supongo.
Por un lado se podria substituir con gsub lo que queramos:

 "http://www.example.com/foo.bar?baz".gsub(%r{[.?/]}) {|c| sprintf

“%%%02X”, c[0]}
=> “http:%2F%2Fwww%2Eexample%2Ecom%2Ffoo%2Ebar%3Fbaz”

En tal caso los porcentajes se escapan al formar la URL, y el
reconocedor de paths al procesar la URL extrae el valor y los
desescapa, con lo que en params obtienes lo que enviaste y has de
hacer la operacion inversa:

 >> "http:%2F%2Fwww%2Eexample%2Ecom%2Ffoo%2Ebar%3Fbaz".gsub(/%../)

{|c| c[1,2].to_i(16).chr.to_s }
=> “http://www.example.com/foo.bar?baz

Pero de todos modos el comportamiento de Rails aqui no me cuadra. Yo
esperaria que si una ruta tiene un placeholder :foo, aquello que se
asigne a :foo no deberia llevar los caracteres que son separadores por
defecto:

  module Routing
    SEPARATORS = %w( / . ? )
    ...
  end

sin ser escapados. Ya que entonces la idea de que ahi va un valor que
luego puedo recuperar tal cual, y ya te encargas tu de hacer lo
necesario en la URL (como lo hace correctamente con un “%” por ejemplo).

Con :requirements se puede conseguir que el punto pase, pero creo que
no es el camino.

Salvo que se me escape algun rationale que no se me ocurre, creo que
para que esa URL se pudiera asignar a un cacho de ruta no deberiamos
tener que hacer nada. Tendria que ir tan fino como va un 7. Bajo mi
punto de vista los gsub de arriba son un hack para saltarnos el parser
de rutas que es necesario porque la generacion no le tuvo en cuenta,
lo que me huele a bug.

Probablemente envie un parche.

– fxn

Hola Xavier, muchas gracias, ha funcionado con esa tranformación.
No sé si esto debería ser transparente, cuando trabajaba en J2EE y tenía
alguna de estas cosas tenía que codificarlo y descodificarlo a pelo,
aunque al menos ahí su URLEncode y tal funcionaba.