这是我简单的rails 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>
问题是&
中的&
会被重写。我无法想象如何防止转义,因为Rails 3中不存在:escape => false
答案 0 :(得分:6)
更新:所以这是源
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
缩进示例答案 1 :(得分:0)
Rory O'Kane是现场。回答“为什么在使用link_to生成网址时,&符号会被转义?”这是在网址中分隔参数的正确方法。
网址是否存在问题? 如果是这样,你能详细说明问题吗?
您可以通过在整个网址上使用raw
来阻止转义网址,如下所示:
<%= link_to "link", raw(gateway_index_url(developer:@item.developer.api_key, tracker:"email", url:@product.url)) %>