2011-05-19 20 views
43

Si estoy en una vista RHTML en Rails, es fácil de URL de escape de algo:¿Cómo puedo escapar una URL de una cadena en Rails?

<a href="/redirect?href=<%=u target %>">Foo</a> 

¿Cómo puedo hacer esto en una cadena? Me gustaría hacer algo como esto:

<% redirect_href = "/redirect?#{url_escape target}&amp;foo=bar&amp;baz=some_other_stuff" -%> 
<a href="<%= redirect_href =>">Foo</a> 

Esto debe ser trivial, ¿verdad?

Respuesta

69

CGI.escape lo hará:

<% redirect_href = "/redirect?#{CGI.escape target}&amp;foo=bar&amp;baz=some_other_stuff" -%> 
<a href="<%= redirect_href =>">Foo</a> 
+0

enlace se ha roto; rubybrain se ha ido – Lambart

+1

El enlace a CGI.escape está arreglado ahora –

+2

'CGI.escape' no es lo mejor, ya que codifica el espacio como '+' que está en desuso y no siempre analiza correctamente en el otro lado. Por ejemplo, si tiene la ruta Rails "/ my-path /: query" donde query incluye '+', se mantendrá como '+' después del análisis de ruta. Para que funcione mejor, use 'ERB :: Util.u (cadena)', que escapa espacio como "% 20". –

57

rieles (activesupport) define Hash#to_param (alias a Hash#to_query):

{foo: 'asd asdf', bar: '"<#$dfs'}.to_param 
# => "bar=%22%3C%23%24dfs&foo=asd+asdf" 

Vale la pena señalar que ordena llaves de consulta (para almacenamiento en caché HTTP).

Hash#to_param acepta también el parámetro opcional espacio de nombres:

{name: 'David', nationality: 'Danish'}.to_param('user') 
# => "user[name]=David&user[nationality]=Danish" 

http://api.rubyonrails.org/classes/Hash.html#method-i-to_param

+0

Esta es, de lejos, la forma más fácil y limpia. – Nikhil

25

ERB::Util.url_encode

se puede utilizar desde cualquier lugar, parte de rubí lib std.

+0

Eso es para escaparse de HTML, no escaparse de URL. –

+0

thx @DaveJamesMiller respuesta actualizada –

Cuestiones relacionadas