Как предотвратить экранирование URL-адреса в значении атрибута в шаблоне 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

(Он создает XML для файла модуля OpenSocial, но это не важно.)

Проблема в том, что отображаемый XML выглядит так:

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

Этот суффикс URL должен быть "bar=baz&yoo=hoo". Как не дать Строителю сбежать от амерпсанда?

Позже

Возможно, суффикс URL-адреса должен быть "bar=baz&amp;yoo=hoo" в источнике для правил проверки XML, но, конечно же, он не должен быть двойным-экранированным, не так ли?


person James A. Rosen    schedule 28.09.2009    source источник


Ответы (3)


Я знаю, что опаздываю, но для тех, кто заходит из Google (например, я), хитрость заключается в том, чтобы добавить :escape => false к url_for - таким образом URL-адрес экранируется только один раз.

person Topper    schedule 18.07.2010

Я предполагаю, что это потому, что XHTML требует, чтобы & был экранирован как &amp; (даже в URL-адресах), и XML, в котором вы храните URL-адрес, также требует этого, давая двойной переход (&amp;amp;), который будет декодировать &amp; в URL-адресе, что совершенно правильно в HTML (и обязательно в XHTML).

Например, следующий код является допустимой ссылкой XHTML на http://example.com/?a=b&c=d:

<a href="http://example.com/?a=b&amp;c=d">link</a>

Итак, я предполагаю, что foos_url возвращает вам URL-адрес, уже содержащий &amp;, а затем он снова экранируется вашим XML-модулем.

person Pierre Bourdon    schedule 28.09.2009

Нет, не должно, иначе сгенерированный файл XML будет недействительным, правильный анализатор будет переводить обратно в & при разборе файла.

Редактировать: неважно, переведено в & в первом сообщении.

person mickael9    schedule 28.09.2009
comment
Но там два ампера - сам экранирован. Этого не может быть. - person James A. Rosen; 29.09.2009