Содержимое Rails/Backbone.js с тегом script показывает ошибку "Uncaught SyntaxError: Неожиданный токен ILLEGAL"
У меня есть приложение с содержимым страницы, которое содержит теги сценария, но при попытке его визуализации выдает ошибку "Uncaught SyntaxError: Неожиданный токен ILLEGAL".
Я инициализирую магистральное приложение следующим образом:
- content_for :javascript do
- javascript_tag do
App.initialize({ data: #{@data.to_json.html_safe } });
который генерирует следующий JSON:
<script type="text/javascript">
//<![CDATA[
App.initialize({ data: {"content":"<div style=\"padding-left:5px;\"><script type=\"text/javascript\" src=\"http://www.opentable.com/frontdoor/default.aspx?rid=52900&restref=52900&bgcolor=8AA86B&titlecolor=0F0F0F&subtitlecolor=0F0F0F&btnbgimage=http://www.opentable.com/frontdoor/img/ot_btn_black.png&otlink=FFFFFF&icon=light&mode=short&hover=1\"></script></div>"});
//]]>
</script>
Я пытаюсь сделать это следующим образом (с hamlc):
- if @page.attributes.content
.text.page-content~ @page.attributes.content
2 ответа
С помощью Чада из Thoughtbot.com мне указали на следующий пост в блоге. По-видимому, это "недостаток" в том, что JSON удалось избежать. http://jfire.io/blog/2012/04/30/how-to-securely-bootstrap-json-in-a-rails-view/
Сначала переопределите функцию JSON.
config/initializers/json_escape.rb
class ActionView::Base
def json_escape(s)
result = s.to_s.gsub('/', '\/')
s.html_safe? ? result.html_safe : result
end
alias j json_escape
end
(перезагрузите сервер)
И по вашему мнению используйте j
функционировать перед вашим рубиновым кодом:
- content_for :javascript do
- javascript_tag do
App.initialize({ data: #{j @data.to_json.html_safe } });
С помощью данного фрагмента JSON на стороне сервера будет сгенерирован следующий контент JavaScript для загрузки приложения:
App.initialize({ data: "content":"<div>...</div>" });
Который не является допустимым JavaScript. Вы должны обернуть data
ключ вводит сам объект, например:
App.initialize({ data: { "content":"<div>...</div>" }});
таким образом, вы должны получить следующую версию Haml на стороне сервера:
- content_for :javascript do
- javascript_tag do
App.initialize({ data: { #{@data.to_json.html_safe } } });