Я думаю, что ваши имена тегов должны быть введены пользователем, верно?
В этом случае html_safe
не ваш первый выбор, поскольку он полностью доверяет пользователю. И ваш сайт столкнется с XSS-атаками.
Лучший выбор должен быть sanitize
. См. Ссылку здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html
Поскольку вы хотите иметь только ссылки, следующая строка делает то, что вы хотите:
<%= sanitize @post.tags.collect {|c| (link_to strip_links(c.name), c)}.join(", "), :tags => %w(a) %>
Обратите внимание на использование strip_links(c.name)
, при этом удаляются все ссылки, введенные пользователем.
Давайте предположим, что имена тегов: ["Product", " hi ", "bye"]
При использовании .html_safe
будет показано следующее:
<a href="/tags/1">Product</a>, <a href="/tags/2"><strong>hi</strong></a>, <a href="/tags/3"><a href='bad_site.com'>bye</a></a>
Но, используя смесь sanitize с strip_links, получается следующее:
<a href="/tags/1">Product</a>, <a href="/tags/2"><strong>hi</strong></a>, <a href="/tags/3">bye</a>
Или вы можете смешать использование strip_tags
с .html_safe
:
<%= @post.tags.collect {|c| (link_to strip_tags(c.name), c)}.join(", ").html_safe %>
Это просто удаляет все теги в c.name
перед вызовом html_safe.
Я бы предложил (и вы, вероятно, уже делаете: D) удалить все ненужные теги перед сохранением в базе данных.