"link_to" helper: Looking for no encoding in URLs

Hi you all,

I have a RESTful app where my link_to is something like
<%= link_to(“Trial”,sdrs_query_path(params[:id] + “= Trial”)) %>

When click on the link the URL that appears on the browser (or simply by
putting the mouse over the link) is something like:

http://localhost:3007/sdrs/queries/vlan_interfaz%3DTrial

Is there anyway to avoid this? I want the equal sign as it is in the
URL.

(With a simple it does not happen, just with the link_to)

Damaris F.
escribió:> I have a RESTful app where my link_to is something like

(With a simple it does not happen, just with the link_to)
Hola Damaris, esta lista es en castellano :smiley:

Supongo que sabes que el = en la URL sirve para asignar un valor a un
parámetro en llamadas GET:

Foo.com

¿Lo quieres usar para eso? Si no es así tendrás que dejar que Rails lo
traduzca (es lo correcto en este caso) o buscar una alternativa a ese
carácter.


Raul M. - Freelance Web D.
http://raul.murciano.net

Hola, pensé que lo había dejado en el foro no castellano :smiley:

Sí,sé lo de los parámetros (y no quiero hacer eso), pero el
comportamiento es curioso:

Aunque me mande a la dirección:
http://localhost:3007/sdrs/queries/vlan_interfaz%3DTrial
si yo la cambio a pelo en el navegador a:
http://localhost:3007/sdrs/queries/vlan_interfaz=Trial
funciona igualmente, incluido si he paginado los resultados y tengo algo
así como:
http://localhost:3007/sdrs/queries/vlan_interfaz=Trial?page=3

Vamos, que me parece estupendo que Rails codifique, pero si no existe
problemas (como parece ser este caso) debería dejarlo como está.

Raul M. wrote:

Damaris F.
escribi�:> I have a RESTful app where my link_to is something like

(With a simple it does not happen, just with the link_to)
Hola Damaris, esta lista es en castellano :smiley:

Supongo que sabes que el = en la URL sirve para asignar un valor a un
par�metro en llamadas GET:

Foo.com

�Lo quieres usar para eso? Si no es as� tendr�s que dejar que Rails lo
traduzca (es lo correcto en este caso) o buscar una alternativa a ese
car�cter.


Raul M. - Freelance Web D.
http://raul.murciano.net

Damaris F. escribió:

Sí, si no digo que no :slight_smile:
Pero me pidieron una aplicación RESTful y mis usuarios se quedan un poco
con cara de situación cuando ven que las URLs no salen tan bonitas, con
todos esos caracteres codificados.

Mmmm, no veo la relación con REST. De todas formas si el problema es la
estética de la URL seguramente puedas ingeniártelas para escapar los
caracteres antes de que lo haga Rails :wink:


Raul M. - Freelance Web D.
http://raul.murciano.net

Sí, si no digo que no :slight_smile:
Pero me pidieron una aplicación RESTful y mis usuarios se quedan un poco
con cara de situación cuando ven que las URLs no salen tan bonitas, con
todos esos caracteres codificados.

Raul M. wrote:

Damaris F. escribió:

así como:
http://localhost:3007/sdrs/queries/vlan_interfaz=Trial?page=3

Vamos, que me parece estupendo que Rails codifique, pero si no existe
problemas (como parece ser este caso) debería dejarlo como está.

Bueno, es cuestión de opiniones :wink:

A mí me gusta curarme en salud y que todo siga en lo posible los RFC’s y
estándares apropiados, así que en este caso concreto estoy con Rails :slight_smile:


Raul M. - Freelance Web D.
http://raul.murciano.net

Por otro lado, aprovecho para exponer lo siguiente (igual debería abrir
otro hilo)

Mis rutas son algo así como
queries/:id
donde :id tiene como requirement una Regexp por el cual yo podría tener
lo siguiente:

key
key=valor
key=valor/key
key=valor/key=valor
key=valor/key=valor/key=valor/key=valor …

Es decir, parejas de key=valor hasta el infinito. En routes.rb sólo se
me ocurría con una expresión regular.
Sin embargo, al realizar un link_to con un id como prueba=valor/prueba2
me da el siguiente error:

ActionController::RoutingError in Queries#show
Showing app/views/queries/by_att.rhtml where line #20 raised:
sdrs_query_url failed to generate from {:action=>“show”,
:controller=>“queries”, :id=>“prueba=valor/prueba2”}, expected:
{:action=>“show”, :controller=>“queries”}, diff:
{:id=>“prueba=valor/prueba2”}

Intuyo que es por la barra pero… cómo podría hacerlo entonces?

PT: Mi entrada en routes.rb:

query_pattern = Regexp.new(’(\w+[=]?\w*[/]?)*’)
map.resources :queries, :path_prefix =>’/sdrs’, :name_prefix=>‘sdrs_’,
:requirements=> {:id =>query_pattern}

De todas maneras, el caracter “|” también lo escapa… y no creo que ese
carácter se pueda confundir con algún otro usual en una ruta… grr…

Damaris F. escribió:

así como:
http://localhost:3007/sdrs/queries/vlan_interfaz=Trial?page=3

Vamos, que me parece estupendo que Rails codifique, pero si no existe
problemas (como parece ser este caso) debería dejarlo como está.

Bueno, es cuestión de opiniones :wink:

A mí me gusta curarme en salud y que todo siga en lo posible los RFC’s y
estándares apropiados, así que en este caso concreto estoy con Rails :slight_smile:


Raul M. - Freelance Web D.
http://raul.murciano.net

Espera! El router globbing es justo lo que ellos querían en un
principio!!

Ahora mismo tengo un recurso en la base de datos, y lo que quieren es
filtrarlo por sus atributos. Para un filtrado de un solo atributo ya
tenía:

http://foo.com/queries/:key/:value

Sin embargo, ellos quieren poder filtrar por más de uno, y quieren que
la URL que se vaya originando sea
http://foo.com/queries/:key/
http://foo.com/queries/:key/:value
http://foo.com/queries/:key/:value/:key2
http://foo.com/queries/:key/:value/:key2/:value2
(etc)

Así lo que tú llamas como router globbing (que nunca había oido hablar
de él) es lo que ellos necesitan :DDD
¿Donde puedo encontrar más información acerca de esa u otra forma de
enrutamientos que no son tan comunes? No aparece en el Rdoc, que yo
sepa, ni en el libro de Agile Web D. (miraré ahora por Google)

Gracias!!!

Raul M. wrote:

Damaris F. escribió:

key=valor/key
key=valor/key=valor
key=valor/key=valor/key=valor/key=valor …

Me vas a llamar pesado, pero insisto en que mapear directamente
expresiones con caracteres reservados para URLs a URLs es meterse en un
jardín muy complicado :frowning: Si no quieres escapar las cosas a mano yo veo
dos alternativas:

  1. Notación tradicional (fea, sencilla como ella sola):

    http://foo.com/queries?key
    http://foo.com/queries?key=valor
    http://foo.com/queries?key=valor&key2=valor2

  2. El “routes globbing” (más chula, pero tampoco es exactamente lo que
    quieres):

    http://foo.com/queries/key1/valor1/key2/valor2

    Este efecto lo consigues con:

    map.connect ‘queries/*pairs’, :controller =>‘…’, :action => ‘…’

    De esta forma con la URL:

    http://foo.com/queries/key1/valor1/key2/valor2

    tu params[:pairs] sería un array tal que así:

    [key1, valor1, key2, valor2]

De todas formas, francamente:

  • Si tu jefe/cliente no sabe las implicaciones de lo que te ha pedido
    puedes explicarle la situación y ofrecerle la alternativa de escapar los
    caracteres problemáticos a costa de que no se vean tal cual en la URL, o
    cualquiera de las otras dos que te propongo (+ las alternativas que
    puedan surgir en esta lista).

  • Si sabe bien lo que te ha pedido, por favor dile de mi parte que tiene
    muy mala leche… :smiley:


Raul M. - Freelance Web D.
http://raul.murciano.net

La notación tradicional hubiera sido una opción (las query variables)
pero están enchufando un crawler para indizar y un buscador, y existen
algunos buscadores que obvian las rutas con query variables.

Damaris F. escribió:

la URL que se vaya originando sea
sepa, ni en el libro de Agile Web D. (miraré ahora por Google)
Ah, entonces genial! :slight_smile:

Yo leí sobre esto por primera vez en el “Rails Routing” (un PDF de David
Black), y también lo menciona de pasada el propio David Black en la
parte de “The Rails Way” dedicada a los enrutamientos. Ahora mismo no
recuerdo haberlo leído en ningún otro sitio, pero seguro que googleando
encuentras algo…


Raul M. - Freelance Web D.
http://raul.murciano.net

Damaris F. escribió:

key=valor/key
key=valor/key=valor
key=valor/key=valor/key=valor/key=valor …

Me vas a llamar pesado, pero insisto en que mapear directamente
expresiones con caracteres reservados para URLs a URLs es meterse en un
jardín muy complicado :frowning: Si no quieres escapar las cosas a mano yo veo
dos alternativas:

  1. Notación tradicional (fea, sencilla como ella sola):

    http://foo.com/queries?key
    http://foo.com/queries?key=valor
    http://foo.com/queries?key=valor&key2=valor2

  2. El “routes globbing” (más chula, pero tampoco es exactamente lo que
    quieres):

    http://foo.com/queries/key1/valor1/key2/valor2

    Este efecto lo consigues con:

    map.connect ‘queries/*pairs’, :controller =>‘…’, :action => ‘…’

    De esta forma con la URL:

    http://foo.com/queries/key1/valor1/key2/valor2

    tu params[:pairs] sería un array tal que así:

    [key1, valor1, key2, valor2]

De todas formas, francamente:

  • Si tu jefe/cliente no sabe las implicaciones de lo que te ha pedido
    puedes explicarle la situación y ofrecerle la alternativa de escapar los
    caracteres problemáticos a costa de que no se vean tal cual en la URL, o
    cualquiera de las otras dos que te propongo (+ las alternativas que
    puedan surgir en esta lista).

  • Si sabe bien lo que te ha pedido, por favor dile de mi parte que tiene
    muy mala leche… :smiley:


Raul M. - Freelance Web D.
http://raul.murciano.net

Y sobre lo de no mapear directamente expresiones con caracteres URL,
estoy de acuerdo en que cuantas menos preocupaciones mejor,
pero mira por ejemplo una busqueda en google:

http://images.google.es/imgres?imgurl=http://bp1.blogger.com/_H6csiPsnJyE/Rqq0sopHgtI/AAAAAAAAADM/TpUl22mvZio/s320/raul.jpg&imgrefurl=http://guatemala.blogalaxia.com/busca/raul&h=320&w=305&sz=26&hl=es&start=2&um=1&tbnid=c0eU1AgljjtgjM:&tbnh=118&tbnw=112

Hay parametros como imgrefurl=http://guatemala

Es decir, el valor es un string que es una url, con sus barritas. Y no
hay ningún problema… No sé por qué con Rails este tema es tan
complicado :frowning:

Damaris F. escribió:

complicado :frowning:
No es que sea complicado, es que tener esos caracteres reservados en las
URLs seguramente puede dar problemas en alguna situación. Ya te digo que
para estas cosas yo prefiero seguir los estándares, y el RFC lo deja
claro en este caso:

Many URL schemes reserve certain characters for a special meaning:
their appearance in the scheme-specific part of the URL has a
designated semantics. If the character corresponding to an octet is
reserved in a scheme, the octet must be encoded.  The characters 

“;”,
“/”, “?”, “:”, “@”, “=” and “&” are the characters which may be
reserved for special meaning within a scheme. No other characters
may
be reserved within a scheme.

Más info: http://www.rfc-editor.org/rfc/rfc1738.txt


Raul M. - Freelance Web D.
http://raul.murciano.net

Um, tengo un problemilla ahora con el “route globbing”. Estoy utilizando
el método “respond_to”, admitiendo formatos HTML y XML.

Así que, cuando introduzco en el browser algo como /key/value.xml
toma todo como la ruta, obviando el XML ( no lo obvia, lo incluyo como
parte del segundo valor de la ruta).
Funciona bien haciendo las llamadas desde un cliente HTTP como curl,
pero n desde el navegador. ¿Teneis idea de cómo resolver esto?

PD: Mis rutas en routes.rb serían estas:
map.connect
‘sdrs/queries/+specs.:format’, :controller=> “queries”,
:action=>“show”
map.queries ‘sdrs/queries/*specs’, :controller=> “queries”,
:action=>“show”

He probado a poner un requirements especificando los valores que puede
tener “format”, pero no soluciona nada.

Raul M. wrote:

Damaris F. escribió:

la URL que se vaya originando sea
sepa, ni en el libro de Agile Web D. (miraré ahora por Google)
Ah, entonces genial! :slight_smile:

Yo leí sobre esto por primera vez en el “Rails Routing” (un PDF de David
Black), y también lo menciona de pasada el propio David Black en la
parte de “The Rails Way” dedicada a los enrutamientos. Ahora mismo no
recuerdo haberlo leído en ningún otro sitio, pero seguro que googleando
encuentras algo…


Raul M. - Freelance Web D.
http://raul.murciano.net

Damaris F. escribió:

Um, tengo un problemilla ahora con el “route globbing”. Estoy utilizando
el método “respond_to”, admitiendo formatos HTML y XML.

Así que, cuando introduzco en el browser algo como /key/value.xml
toma todo como la ruta, obviando el XML ( no lo obvia, lo incluyo como
parte del segundo valor de la ruta).
Funciona bien haciendo las llamadas desde un cliente HTTP como curl,
pero n desde el navegador. ¿Teneis idea de cómo resolver esto?

Acabo de probar esto sobre Rails 2.0.2:

map.connect ‘test/*data.:format’, :controller => ‘…’, :action => ‘…’

al pedir http://localhost:3000/test/foo/bar.xml obtengo:

params
=> {“format”=>“xml”, “action”=>“…”, “controller”=>“…”,
“data”=>[“foo”, “bar”]}


Raul M. - Freelance Web D.
http://raul.murciano.net

Damaris F. escribió:

:frowning: Tengo Rails 1.2.5…

Mal asunto :frowning: Por lo que comentan aquí[1] el problema en efecto es la
versión de Rails. Si no puedes subir de versión se me ocurre hacer un
apaño en el controlador, metiendo un filtro que procese a manopla el
último parámetro:

if params[:specs] && params[:specs].last.ends_with?(‘.xml’)
params[:format] = ‘xml’
params[:specs].last.gsub!(‘.xml’,‘’)
end

…o algo así, imagino que ves la idea.

[1] Jay Fields' Thoughts: Rails: Route Globbing


Raul M. - Freelance Web D.
http://raul.murciano.net

Um… el apaño está bien pensado, con algún before_filter, pero este
problema lo tengo en otras rutas. Por ejemplo, permito filtrar por
rangos, y los rangos son decimales, y me gustaría conservar el punto
(sí, ya sé que no debería) pero sería sólo ahí :frowning: Voy a probar a cambiar
la versión de Rails pues.

(Tengo algo así como:
map.sdrs_by_range_times “foo/by_range/:att/:range”, :controller => “…”,
:action => “…”, :att => nil, :range => nil
donde range puede ser decimal, y claro, Rails se confunde con el punto,
aunque no debería, pues si el final es .xml, pues es de la extensión, no
debería confundirse con el resto de puntos… )

:frowning: Tengo Rails 1.2.5…
Si voy a :
http://localhost:3007/test/foo/1024/foo2.xml
Obtengo:
Parameters: {“specs”=>[“puertoa”, “1024”, “diripb.xml”]}

Puede ser la versión… o que tu ruta es un pelín diferente. Yo tengo:
map.connect ‘sdrs/queries.:format’, :controller=> “…”, :action=>“…”
map.connect ‘sdrs/queries/+specs.:format’, :controller=> “…”,
:action=>“…”
map.queries ‘sdrs/queries/*specs.:format’, :controller=> “…”,
:action=>“…”

Entre otras cosas porque no me deja poner la que tú tienes (dice que:
“Route segment “:specs” cannot be optional because it precedes a
required segment.”)

Por cierto, también se comporta bien incluso cuando el último valor es,
por ejemplo, un valor decimal (con punto?). Algo así como:
://localhost:3000/test/foo/bar.loquesea.xml

Gracias por todo :frowning:

Damaris F. escribió:

aunque no debería, pues si el final es .xml, pues es de la extensión, no
debería confundirse con el resto de puntos… )

Por lo que leo en otro hilo has actualizado a Rails 2.0.2, imagino que
es esta aplicación de la que estábamos hablando :wink: Si es así creo que
has hecho muy bien: si quieres una aplicación REST esta versión está
mejor preparada (y el route globbing funciona mejor, ya lo has visto) :smiley:


Raul M. - Freelance Web D.
http://raul.murciano.net