Догадка:
@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 & Co.")).html_safe?
=> false
ruby-1.8.7-p330 :021 > (helper.strip_tags("Tiffany & Co.") + 'Related shops with ').html_safe?
=> true
ruby-1.8.7-p330 :022 > ('Related shops with ' + helper.strip_tags("Tiffany & 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