这是我简单的rails 3代码:
<%= link_to "link", gateway_index_url(developer:@item.developer.api_key, tracker:"email", url:@product.url) %>
Run Code Online (Sandbox Code Playgroud)
结果是:
<a href="/gateway?developer=abcde&tracker=email&url=http%3A%2F%2Fwww.bla.fr%2FproductA" >link</a>
Run Code Online (Sandbox Code Playgroud)
问题在于&重写了&.我无法想象如何防止转义,就像:escape => falseRails 3中不存在一样
更新:所以这是源头
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
Run Code Online (Sandbox Code Playgroud)
我们可以从源头看到,这种行为是设计的.
您可以尝试两种解决方案中的一种,我没有尝试过,但它们应该可以工作
1.)尝试将呼叫置于对#raw的调用内部:
<%= link_to "link", raw(gateway_index_url(developer: @item.developer.api_key, tracker:"email", url:@product.url)) %>
Run Code Online (Sandbox Code Playgroud)
这可能会解决你的具体问题,这是第二种方法,而更强大的力量也应该有效......
2.)如果你想将它(整个href)转换回来,你可以...使用CGI :: unescape_html:
<%= CGI::unescape_html(link_to "link", gateway_index_url(developer: @item.developer.api_key, tracker:"email", url:@product.url)) %>
Run Code Online (Sandbox Code Playgroud)
祝你好运,希望这会有所帮助.
更新2:修复了对cgi unescape的调用,正在使用"." 什么时候它应该是"::"和格式化修复.忘了为#1缩进示例
| 归档时间: |
|
| 查看次数: |
2236 次 |
| 最近记录: |