Почему HTML-апострофы в Rails 2 дают неожиданный результат? - PullRequest
2 голосов
/ 04 февраля 2011

Я использую h для кодирования HTML-кода в Rails 2, но у меня проблемы с апострофами. Точнее, я обнаружил, что мои апострофы заканчиваются на ', что явно не нужно, чтобы я хотел показать.

У кого-нибудь есть идеи, почему это происходит? Мое исследование показало, что кодирование HTML не должно влиять на апострофы.

Ответы [ 4 ]

4 голосов
/ 04 февраля 2011

Это интересный вопрос. Я вижу несоответствие в том, как h АКА html_escape обрабатывает апостроф АКА "'".

Согласно RDoc для ERB :: Util 2.6.6:

ESCAPE_TABLE = { '&'=>'&amp;', '<'=>'&lt;', '>'=>'&gt;', '"'=>'&quot;', "'"=>'&#039;', }

gem list erubis
*** LOCAL GEMS ***
erubis (2.6.6)

В IRB я вижу:

Welcome to IRB. You are using ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.5.0]. Have fun ;)
>> require 'erb' #=> true
>> ERB::Util.html_escape("foo'bar") #=> "foo'bar"
>> ERB::Util.html_escape('foo"bar') #=> "foo&quot;bar"

EDIT:

Хех, это ошибка или, по крайней мере, несоответствие в методе h. Вот источник:

# File 'lib/erubis/helpers/rails_helper.rb', line 342

def h(value)
  value.to_s.gsub(/[&<>"]/) {|s| ESCAPE_TABLE[s] }
end

Обратите внимание, что строка, передаваемая в gsub, не содержит "'"? Это означает, что поиск ESCAPE_TABLE не вызывается для одинарных кавычек / апострофа.

И мы все знаем, что суть печенья - это апостроф. : -)

Я ожидаю, что если я посмотрю на определение h или html_escape в вашей версии Rails, мы обнаружим, что в эту строку включен апостроф.

Исправление: обновить ERB / ​​Erubis или переопределить определение h / html_escape, чтобы оно было правильным. Вы можете использовать приведенное выше определение в качестве отправной точки.

3 голосов
/ 27 мая 2014

У меня была похожая проблема в Rails 4, где апострофы отображались бы как &#39; Проблема на самом деле в том, что я использовал функцию truncate для отображения текста. Как только это будет удалено, апострофы будут отображаться, как и ожидалось.

В этом случае добавление escape:false в качестве опции для усечения решает проблему.

1 голос
/ 04 февраля 2011

При просмотре исходного кода в actionpack/lib/action_view/erb/util.rb апострофы не кодируются, только & > < " символов.

Я предполагаю, что где-то в вашем Rails-приложении библиотека / плагин / gem переопределила html_escape или константу HTML_ESCAPE Вам также следует проверить свои данные непосредственно в базе данных, чтобы убедиться, что они не были закодированы при сохранении.

1 голос
/ 04 февраля 2011

Ruby on Rails 3 делает h автоматически.Это больше не нужно.Используйте

<%= @post.body %>

вместо

<%=h @post.body %>

Если вы хотите выводить что-либо без экранирования, используйте raw:

<%=raw @post.body %> <!-- For example, for use in a plaintext format */
...