2013-08-22 5 views
6

Hier ist meine einfachen Schienen 3-Code:Warum sind kaufmännische Und-Zeichen beim Generieren von URL mit link_to ausgeblendet?

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

Und das Ergebnis ist:

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

Das Problem ist, dass & in &amp; neu geschrieben werden. Ich kann nicht verstehen, wie Flucht zu verhindern, wie :escape => false nicht in Rails 3

+1

Der generierte Markup ist der richtige Weg, um eine Link-URL mit Et-Zeichen in sie zu schreiben. Browser werden URLs mit nicht aufgedecktes kaufmännisches Und-Zeichen verstehen, aber sie sind technisch inkorrekt. Wenn Sie Quelltext in Firefox anzeigen und den HTML-Code für eine Verknüpfung mit nicht aufgefangenen Et-Zeichen suchen, werden die Et-Zeichen als Fehler angezeigt. –

+0

Sie meinen, dass/foo? A = 1 & b = 2 ist falsch und sollte immer als/foo geschrieben werden? A = 1 & b = 2? – EricLarch

+0

Genau. Wie in [diese Antwort] (http://stackoverflow.com/a/1911482/578288) beschrieben, sollten alle Elementattribute in HTML '&', '" ',' '' und ein paar andere Zeichen enthalten href' Attribut des 'a' Elements ist keine Ausnahme. –

Antwort

6

-Update vorhanden ist: So, hier ist die Quelle

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 

Wie wir von der Quelle sehen, dieses Verhalten ist von Entwurf .

Sie können eine von zwei Lösungen versuchen, ich habe sie nicht versucht, aber sie sollten

1.) arbeiten Versuchen Sie, den Anruf tätigen innerhalb eines Anrufs an das Gateway #raw:

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

Das kann Ihr spezifisches Problem lösen, ein zweiter Ansatz, während ein bisschen mehr Brute-Force auch funktionieren sollte ...

2.) Wenn Sie es (den ganzen href) zurück konvertieren möchten, können Sie ... verwenden CGI :: unescape_html:

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

Viel Glück, hoffentlich hilft das.

Update 2: Fester Aufruf von CGI Unescape, wurde mit "." wenn es "::" sein sollte und Formatierung beheben. Forgot to handle for # 1

0

Rory O'Kane ist genau richtig. Die Antwort auf "Warum sind kaufmännische Und-Zeichen beim Generieren von URL mit link_to?" ist das der richtige Weg, um Params in einer URL zu trennen.

Gibt es ein Problem mit der URL, wie es ist? Wenn ja, könnten Sie das Problem näher erläutern?

Unter Umständen können Sie die URL verhindern Flucht durch raw auf die gesamte URL wie folgt:

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

Ich wusste einfach nicht, dass es so war .. Nie, schrieb nie meine URLs auf diese Weise – EricLarch

Verwandte Themen