В приложении Rails 3.1 как можно Я безопасно встраиваю некоторые данные JSON в документ HTML?
Предположим, у меня есть это в действии контроллера:
@tags = [
{name:"tag1", color:"green"},
{name:"</script><b>I can do something bad here</b>", color:"red"}
]
И это в соответствующем представлении:
<script type="text/javascript" charset="utf-8">
//<![CDATA[
var tags_list = <%= @tags.to_json %>;
// ]]>
</script>
Затем я получаю это в результирующем HTML:
var tags_list = [
{"name":"tag1","color":"green"},
{"name":"</script><b>I can do something bad here</b>","color":"red"}
];
, который запускает SyntaxError: Неожиданный токен и
в Chrome
Если я удалю стандартный HTML-код Rails с экранированием с помощью <% = raw tags.to_json
%>
, затем он возвращает следующее:
var tags_list = [
{"name":"tag1","color":"green"},
{"name":"</script><b>I can do something bad here</b>","color":"red"}
];
, что, конечно же, разбивает HTML-документ на
.
Могу ли я каким-то образом указать методу to_json () вернуть что-то еще вот так:
var tags_list = [
{"name":"tag1","color":"green"},
{"name":"</script><b>I can do something bad here</b>","color":"red"}
];
Я задал этот вопрос в списке рассылки rubyonrails-talk, и теперь я понимаю, что некоторые люди думают, что это очень плохая идея для начала, но в моем случае это работает очень хорошо, пока нет HTML специальные символы в данных. Поэтому я просто хочу, чтобы строка, возвращаемая to_json
HTML, была безопасной и при этом JavaScript правильно ее анализировал.
ОБНОВЛЕНИЕ: Основываясь на комментарии @coreyward, я сделал его строковым литералом JS, и теперь, похоже, он отлично работает. Это не такое элегантное решение, как я надеялся, но и не так уж и плохо. Вот код, который у меня работает:
<% tags = [{name:"tag1", color:"green"}, {name:"</script><b>I can \n\ndo something bad here</b>", color:"red"}] %>
<script type="text/javascript" charset="utf-8">
//<![CDATA[
var tags_list = $.parseJSON('<%=j tags.to_json.html_safe %>');
// ]]>
</script>
, в результате получается:
<script type="text/javascript" charset="utf-8">
//<![CDATA[
var tags_list = $.parseJSON('[{\"name\":\"tag1\",\"color\":\"green\"},{\"name\":\"<\/script><b>I can \\n\\ndo something bad here<\/b>\",\"color\":\"red\"}]');
// ]]>
</script>