ruby-on-rails-3 – 为什么在使用link_to生成url时,&符号会被转义?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – 为什么在使用link_to生成url时,&符号会被转义?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我简单的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 => Rails 3中不存在false

解决方法

更新:所以这是源头
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,url:@product.url)) %>

这可能会解决你的具体问题,这是第二种方法,而更强大的力量也应该有效……

2.)如果你想将它(整个href)转换回来,你可以…使用CGI :: unescape_html:

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

祝你好运,希望这会有所帮助.

更新2:修复了对cgi unescape的调用,正在使用“.”什么时候它应该是“::”和格式化修复.忘了为#1缩进示例

猜你在找的Ruby相关文章