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

时间:2013-08-22 17:46:28

标签: ruby-on-rails-3

这是我简单的rails 3代码:

<%= link_to "link", gateway_index_url(developer:@item.developer.api_key, tracker:"email", url:@product.url) %>

结果是:

<a href="/gateway?developer=abcde&amp;tracker=email&amp;url=http%3A%2F%2Fwww.bla.fr%2FproductA" >link</a>

问题是&中的&amp;会被重写。我无法想象如何防止转义,因为Rails 3中不存在:escape => false

2 个答案:

答案 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)) %>