Это интересный вопрос. Я вижу несоответствие в том, как h
АКА html_escape
обрабатывает апостроф АКА "'"
.
Согласно RDoc для ERB :: Util 2.6.6:
ESCAPE_TABLE = { '&'=>'&', '<'=>'<', '>'=>'>', '"'=>'"', "'"=>''', }
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"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
, чтобы оно было правильным. Вы можете использовать приведенное выше определение в качестве отправной точки.