这是我简单的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>
问题在于&在& amp;中被重写.我无法想象如何防止转义,如:escape => Rails 3中不存在false
解决方法
更新:所以这是源头
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,url:@product.url)) %>
这可能会解决你的具体问题,这是第二种方法,而更强大的力量也应该有效……
2.)如果你想将它(整个href)转换回来,你可以…使用CGI :: unescape_html:
<%= CGI::unescape_html(link_to "link",gateway_index_url(developer: @item.developer.api_key,url:@product.url)) %>
祝你好运,希望这会有所帮助.
更新2:修复了对cgi unescape的调用,正在使用“.”什么时候它应该是“::”和格式化修复.忘了为#1缩进示例