如何防止Builder模板转义属性值中的URL?

时间:2009-09-28 20:04:57

标签: ruby-on-rails xml url escaping builder

我有一个Rails Builder模板:

# in app/views/foos/index.xml.builder:
xml.Module do |mod|
  ...
  mod.Content :type => 'url',
          :href => foos_url(:bar => 'baz',
                            :yoo => 'hoo')
end

(它为OpenSocial模块文件创建XML,但这并不重要。)

问题是渲染的XML看起来像这样:

<Module>
  ...
  <Content type="url" href="http://myapp.com/foos?bar=baz&amp;amp;yoo=hoo"/>
</Module>

该网址后缀应为“bar=baz&yoo=hoo”。如何防止Builder逃离amerpsand?

后来

在XML有效性规则的源代码中,URL后缀可能应为“bar=baz&amp;yoo=hoo”,但当然不应该 double -escaped,是吗?

3 个答案:

答案 0 :(得分:2)

我想这是因为XHTML要求将&转义为&amp;(即使在网址中),而存储网址的XML也需要这样做,并提供双重转义({{1} })将解码为URL中的&amp;amp;,这在HTML中是完全有效的(在XHTML中是强制的)。

例如,以下代码是链接到&amp;的有效XHTML:

http://example.com/?a=b&c=d

所以我的猜测是<a href="http://example.com/?a=b&amp;c=d">link</a> 会返回一个已包含foos_url的网址,然后再由您的XML模块转义。

答案 1 :(得分:1)

我知道我已经迟到了 - 但对于任何从谷歌(像我这样)进来的人来说,诀窍是添加:escape =&gt;对url_for为false - 这样,url只会被转义一次。

答案 2 :(得分:0)

不,不应该,否则生成的XML文件将无效,正确的解析器将翻译&amp; amp;回到&amp;解析文件时。

编辑:nevermind,&amp; amp;被翻译成&amp;在第一条消息中。