В Ruby on Rails по заданной строке можно определить, был ли вызван .html_safe для этой строки?
Причина вопроса: я хотел бы написать модульный тест контроллера, который проверяет, что html_safe был вызван нет для определенной строки, чтобы доказать, что когда эта строка позже будет отображена на странице в представлении, Rails экранирует строку (избегая возможных XSS-уязвимостей).
Я понимаю, что мог бы вместо этого пойти дальше и фактически отрендерить страницу в моем тесте, а затем проверить отрисованное тело страницы, но мне интересно, есть ли более прямой способ сделать это?
@Stefan Я изучал это, но, похоже, он устарел: apidock.com/rails/v2.3.8/String/html_safe%3F
Уведомления об устаревании нет, и, похоже, все работает нормально.
А, я видел уведомление об устаревании Rails 2.3.8 String.html_safe? в apidock.com/rails/String/html_safe%3F, но похоже, что он был перемещен в Object.html_safe? в более поздних версиях: apidock.com/rails/Object/html_safe%3F
.html_safe
фактически возвращает не объект типа Нить, а объект типа ActiveSupport :: SafeBuffer (который является производным классом String).
Поэтому звоню:
my_string.is_a?(ActiveSupport::SafeBuffer)
вернет false
, только если строка нет является результатом вызова .html_string
.
Есть html_safe?
:
s = 'foo'
s.html_safe? #=> false
s = 'foo'.html_safe
s.html_safe? #=> true
Обратите внимание, что ActiveSupport::SafeBuffer
становится небезопасным, если вы вызываете «деструктивный» метод:
s = 'foo'.html_safe
s.html_safe? #=> true
s.capitalize! #=> 'Foo'
s.html_safe? #=> false
Может через
string.html_safe?
?