更新:所以这里是来源
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 的示例