Почему амперсанды избегали при создании URL-адреса с помощью link_to?

Вот мои простые рельсы 3 кода:

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

И результат:

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

Проблема в том, что & переписаны в &. Я не могу понять, как предотвратить экранирование, поскольку :escape => false не существует в Rails 3

2 ответа

Обновление: Итак, источник

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

Как мы видим, из источника это поведение по дизайну.

Вы можете попробовать одно из двух решений, я их не пробовал, но они должны работать

1.) Попробуйте поместить вызов на шлюз внутри вызова на #raw:

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

Это может решить вашу конкретную проблему, второй подход, в то время как немного более грубая сила также должна работать...

2.) Если вы хотите преобразовать его (весь href) назад, вы можете использовать CGI:: unescape_html:

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

Удачи, надеюсь, это поможет.

Обновление 2: Исправлен вызов cgi unescape, использовался ".". когда это должно быть "::" и исправление форматирования. Забыли пример отступа для # 1


Рори О'Кейн находится на месте. Ответ на вопрос "Почему амперсанды избегали при создании URL-адреса с помощью link_to?" это правильный способ выделения параметров в URL-адресе.

Есть ли проблема с URL-адресом, каким он есть? Если да, не могли бы вы рассказать о проблеме?

Возможно, вы сможете предотвратить экранирование URL-адреса, используя raw на всем URL-адресе:

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

licensed under cc by-sa 3.0 with attribution.