2013-08-22 11 views
6

Oto mój prosty szyny 3 Kod:Dlaczego znaki ampersands zostały usunięte podczas generowania adresu URL z linkiem?

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

a wynik jest:

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

Problemem jest to, że & są przepisywane w &amp;. Nie mogę zrozumieć, jak zapobiegać ucieczce, jako :escape => false nie istnieje w Rails 3

+1

Wygenerowany znaczników jest prawidłowy sposób napisać łącza URL z ampersandów w nim. Przeglądarki będą rozumieć adresy URL z nieokreślonymi znakami ampersand, ale są one niepoprawne pod względem technicznym. Jeśli wyświetlisz Źródło w Firefoksie i znajdziesz kod HTML dla łącza z bezkreslowymi znakami ampersand, zobaczysz, że ampersandy są podświetlone na czerwono jako błąd. –

+0

Masz na myśli to, że/foo? A = 1 & b = 2 jest nieprawidłowe i zawsze powinno być napisane jako/foo? A = 1 & b = 2? – EricLarch

+0

Dokładnie. Jak opisano w [tej odpowiedzi] (http://stackoverflow.com/a/1911482/578288), wszystkie atrybuty elementu w kodzie HTML powinny uciec '&', '' ',' 'i kilka innych znaków.' Atrybut href' elementu 'a' nie jest wyjątkiem –

Odpowiedz

6

Update: Więc oto źródło

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 

Jak widzimy, ze źródła, takie zachowanie jest zgodne z projektem .

można spróbować jednego z dwóch rozwiązań, nie próbowałem ich, ale powinny one pracować

1.) Spróbuj umieścić wezwanie do bramy wewnątrz wywołania #raw:

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

To może rozwiązać twój konkretny problem, drugie podejście, podczas gdy nieco bardziej brutalna siła powinna również zadziałać ...

2.) Jeśli chcesz przekonwertować (cały href) z powrotem możesz ... użyć CGI :: unescape_html:

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

Powodzenia, mam nadzieję, że to pomaga.

Aktualizacja 2: Naprawiono połączenie z cgi unescape, korzystano z "." kiedy powinno być "::" i poprawka formatująca. Zapomniałem podać przykład dla # 1

0

Rory O'Kane jest na miejscu. Odpowiedź na pytanie "Dlaczego ampersandy uciekły podczas generowania adresu URL z linkiem"? czy to jest właściwy sposób na oddzielenie parametrów w adresie URL.

Czy problem z adresem URL jest taki, jaki jest? Jeśli tak, czy mógłbyś rozwinąć problem?

Możesz być w stanie zapobiec ucieczce url za pomocą raw na całej url tak:

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

Po prostu nie wiedziałem, że tak było. Nigdy, nigdy nie pisałem adresów URL w ten sposób – EricLarch

Powiązane problemy