8

这是我的简单 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;. 我不知道如何防止转义,因为:escape => falseRails 3 中不存在

4

2 回答 2

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 的示例

于 2013-08-22T18:00:14.300 回答
1

罗里奥凯恩是现场。“为什么在使用 link_to 生成 url 时转义符号?”的答案 这是在 url 中分隔参数的正确方法。

网址有问题吗?如果是这样,你能详细说明问题吗?

您可以通过raw在整个 url 上使用来防止转义 url,如下所示:

<%= link_to "link", raw(gateway_index_url(developer:@item.developer.api_key, tracker:"email", url:@product.url)) %>
于 2013-08-22T18:23:46.097 回答