RHTML, отображающий HTML-теги на выходе

У меня есть представление RHTML в Rails, где вывод поступает из моей коллекции MongoDB. Данные выводятся правильно с использованием блока итераций, но всякий раз, когда я пытаюсь добавить теги HTML в свою базу данных, они не отображаются в выводе HTML, а просто отображаются.

<%
 @posts.find().each do |post|
%>
 <h1><%=post["name"]%></h1>
 <p><%=post["body"] %></p>
 <p><%=post["timestamp"]%></p>
<%
 end
%>

Но, например, если бы я

<p>Test</p>

В моей базе данных теги будут отображаться, а не печататься.


person Scott Nicol    schedule 15.12.2010    source источник
comment
Вам не нужно find() после @posts   -  person Mark Thomas    schedule 15.12.2010
comment
если @posts является объектом коллекции, он делает   -  person Matt Briggs    schedule 15.12.2010


Ответы (2)


Это мера безопасности, которая теперь встроена в Rails 3. Она предотвращает проблемы XSS (межсайтовый скриптинг).

Если вы добавите raw, вы получите желаемый результат.

<% @posts.each do |post| %> 
 <h1><%=raw post["name"]%></h1> 
 <p><%=raw post["body"] %></p> 
 <p><%=raw post["timestamp"]%></p> 
<% end %> 

Однако, если вы сохраняете произвольный HTML-код, созданный пользователем, я не рекомендую вам делать это, если только вы не очищаете ввод перед его сохранением в базе данных.

Редактировать:

Другой вариант: использование sanitize helper вместо raw, например. <%=sanitize post["name"], :tags => "p" %>, чтобы разрешить <p> теги.

person Mark Thomas    schedule 15.12.2010

Помимо raw и .html_safe, которые обеспечивают 100% доверие к пользовательскому вводу, вы также можете использовать sanitize, чтобы ограничить только допустимое количество тегов.

‹%= очистить сообщение["имя"] $>

Подробнее см.: http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

person PeterWong    schedule 15.12.2010
comment
Хорошее замечание по поводу дезинфекции. +1 вам, и я обновил свой ответ. - person Mark Thomas; 15.12.2010