使用link_to生成网址时,为什么&符号会被转义?

Eri*_*rch 7 ruby-on-rails-3

这是我简单的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&amp;tracker=email&amp;url=http%3A%2F%2Fwww.bla.fr%2FproductA" >link</a>
Run Code Online (Sandbox Code Playgroud)

问题在于&重写了&amp;.我无法想象如何防止转义,就像:escape => falseRails 3中不存在一样

teh*_*sor 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
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缩进示例