2013-08-22 10 views
6

Ecco il mio semplici rotaie 3 Codice:Perché gli e commerciali sono sfuggiti durante la generazione di url con link_to?

<%= link_to "link", gateway_index_url(developer:@item.developer.api_key, tracker:"email", url:@product.url) %> 

e il risultato è:

<a href="/gateway?developer=abcde&amp;tracker=email&amp;url=http%3A%2F%2Fwww.bla.fr%2FproductA" >link</a> 

Il problema è che & vengono riscritte in &amp;. Non riesco a capire come prevenire la fuga, come :escape => false non esiste in Rails 3

+1

Il codice generato è il modo corretto di scrivere un URL di collegamento con e commerciali in esso. I browser comprenderanno gli URL con e commerciali senza caratteri di escape, ma tecnicamente non sono corretti. Se visualizzi l'origine in Firefox e trovi l'HTML per un collegamento con e commerciali senza caratteri di escape, vedrai che gli e commerciali sono evidenziati in rosso come un errore. –

+0

Vuoi dire che/foo? A = 1 & b = 2 non è corretto e dovrebbe sempre essere scritto come/foo? A = 1 & b = 2? – EricLarch

+0

Esattamente. Come descritto in [questa risposta] (http://stackoverflow.com/a/1911482/578288), tutti gli attributi degli elementi in HTML dovrebbero sfuggire a '&', '", '' ', e ad alcuni altri caratteri. L'attributo href' dell'elemento 'a' non fa eccezione –

risposta

6

Aggiornamento: Quindi, ecco la fonte

def link_to(*args, &block) 
    if block_given? 
     options  = args.first || {} 
     html_options = args.second 
     link_to(capture(&block), options, html_options) 
    else 
     name   = args[0] 
     options  = args[1] || {} 
     html_options = args[2] 

     html_options = convert_options_to_data_attributes(options, html_options) 
     url = url_for(options) 

     href = html_options['href'] 
     tag_options = tag_options(html_options) 

     href_attr = "href=\"#{ERB::Util.html_escape(url)}\"" unless href 
     "<a #{href_attr}#{tag_options}>#{ERB::Util.html_escape(name || url)}</a>".html_safe 
    end 
    end 

Come possiamo vedere, dalla sorgente, questo comportamento è di progettazione .

Si può provare una delle due soluzioni, non li ho provato, ma dovrebbe funzionare

1.) Prova di effettuare la chiamata al gateway all'interno di una chiamata a #Raw:

<%= link_to "link", raw(gateway_index_url(developer: @item.developer.api_key, tracker:"email", url:@product.url)) %> 

Questo potrebbe risolvere il tuo problema specifico, un secondo approccio, mentre un po 'più forza bruta dovrebbe anche funzionare ...

2.) Se vuoi convertirlo (l'intero href) indietro puoi ... usare CGI :: unescape_html:

<%= CGI::unescape_html(link_to "link", gateway_index_url(developer: @item.developer.api_key, tracker:"email", url:@product.url)) %> 

Buona fortuna, speriamo che questo aiuti.

Aggiornamento 2: chiamata fissa a cgi unescape, utilizzava "." quando dovrebbe essere "::" e la correzione della formattazione. Hai dimenticato il primo esempio per il numero 1

0

Rory O'Kane è perfetto. La risposta a "Perché gli e commerciali sono sfuggiti durante la generazione di url con link_to?" questo è il modo corretto per separare i parametri in un URL.

C'è un problema con l'URL così com'è? Se sì, potresti approfondire il problema?

Si può essere in grado di prevenire la fuga l'URL utilizzando raw su tutto l'URL in questo modo:

<%= link_to "link", raw(gateway_index_url(developer:@item.developer.api_key, tracker:"email", url:@product.url)) %> 
+0

Non sapevo che fosse così. Mai, mai ho scritto i miei urls in questo modo – EricLarch

Problemi correlati