Rails: метод link_to - PullRequest
       1

Rails: метод link_to

1 голос
/ 11 января 2011

У меня есть что-то вроде этого:

<p>
  <b>Tags:</b>
  <%if @post.tags.count > 0%>
    <%= @post.tags.collect {|c| (link_to c.name, c)}.join(", ")%>
  <%else%>
    Does not have any tags.
  <%end%>
</p>

Что дает мне

Tags: <a href="/tags/1">Java</a>, <a href="/tags/2">CSS</a>

вместо ссылок Java и CSSЧего мне не хватает?

Ответы [ 3 ]

6 голосов
/ 11 января 2011

Это потому, что строки в Rails 3 по умолчанию не считаются HTML-безопасными.См. эту запись в блоге об этом.

Вы можете вручную пометить что-то как безопасное, вызвав .html_safe, что сделает ваш код таким:

<p>
  <b>Tags:</b>
  <%if @post.tags.count > 0%>
    <%= @post.tags.collect {|c| (link_to c.name, c)}.join(", ").html_safe %>
  <%else%>
    Does not have any tags.
  <%end%>
</p>

Но я бы порекомендовал сделать это вместо:

<p>
  <b>Tags:</b>
  <% if @post.tags.count > 0%>
    <% @post.tags.each_with_index do |tag, i| %>
      <%= link_to h(tag.name), tag %><%= ', ' if i < @post.tags.size - 1 %>
    <% end %>
  <% else %>
    Does not have any tags.
  <%end%>
</p>
3 голосов
/ 11 января 2011

Я думаю, html_safe - это то, что вы ищете!Так что это решит проблему (@ post.tags.collect {| c | (link_to c.name, c)}. Join (",")). Html_safe

1 голос
/ 11 января 2011

Я думаю, что ваши имена тегов должны быть введены пользователем, верно?

В этом случае 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">&lt;strong&gt;hi&lt;/strong&gt;</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) удалить все ненужные теги перед сохранением в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...