Как раздеться & от строки? - PullRequest
6 голосов
/ 08 апреля 2011

Использование RoR 2.3.8

name имеет значение Tiffany & Co.

Этот код в представлении:

@header_title = 'Related shops with ' + strip_tags(@shop.name)

дает результат A:

#note that the & has NOT been stripped
Related shops with Tiffany & Co.

Этот код в представлении:

@header_title = strip_tags(@shop.name) + 'Related shops with '

дает результат B:

#note that the & HAS been stripped
Tiffany & Co. Related shops with

Я действительно хочу Related shops with Tiffany & Co. (т.е. преобразовать & в &)

Как мне это сделать?

Почему при втором вызове & удаляется, но не при первом вызове?

1 Ответ

6 голосов
/ 08 апреля 2011

Догадка:

@header_title = ('Related shops with ' + strip_tags(@shop.name)).html_safe

В вашем примере & на самом деле не разделен ни в одном из случаев. Если строка не помечена как безопасная html, по умолчанию она экранируется при добавлении для просмотра, поэтому & становится &, если вы проверяете источник страницы.

Альтернатива, когда @header_title не безопасен в формате html, и вы добавляете его в представление erb:

<%= raw @header_title %>

Эта HTML-безопасность связана с защитой Rails XSS:

Обратите внимание, что вы должны использовать html_safe и raw только тогда, когда доверяете содержимому строки.

- редактировать

Отредактировал ответ после тестирования в консоли Rails 3. До сих пор не знаю, почему там важен порядок.

ruby-1.8.7-p330 :020 > ('Related shops with ' + helper.strip_tags("Tiffany &amp; Co.")).html_safe?
 => false 
ruby-1.8.7-p330 :021 > (helper.strip_tags("Tiffany &amp; Co.") + 'Related shops with ').html_safe?
 => true 
ruby-1.8.7-p330 :022 > ('Related shops with ' + helper.strip_tags("Tiffany &amp; Co.")).html_safe.html_safe?
 => true

- edit2

Дальнейшее тестирование. Похоже, порядок имеет значение при объединении безопасных и небезопасных строк.

ruby-1.8.7-p330 :037 > safe = "This is html safe string".html_safe
 => "This is html safe string" 
ruby-1.8.7-p330 :038 > not_safe = "This is not html safe string"
 => "This is not html safe string" 
ruby-1.8.7-p330 :039 > (safe + not_safe).html_safe?
 => true 
ruby-1.8.7-p330 :040 > (not_safe + safe).html_safe?
 => false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...