我正在编写一个应用程序,它在后端使用Rails,在前端使用javascript / backbone。我正在尝试bootstrap some rails models into my javascript。具体来说,我想将@courses
的内容加载到名为window.courses
的js变量中。我在html.erb
文件中有以下内容。
<%= javascript_tag do %>
window.courses = JSON.parse('<%= @courses.to_json %>');
<% end %>
我期待erb
预处理器将其渲染为有效的javascript,就像这样
<script type="text/javascript">
//<![CDATA[
window.courses = JSON.parse('[{"code":"myCourseCode", ...
//]]>
</script>
...但是,我得到的代码包含HTML entities。
<script type="text/javascript">
//<![CDATA[
window.courses = JSON.parse('[{"code":"myCourseCode", ...
//]]>
</script>
显然,当我尝试解析时,我收到了javascript错误。
有谁知道如何处理这些HTML实体以生成有效的JavaScript?我意识到一个选项是unescape the entities on the client side,但这似乎是一个迂回的解决方案。有没有办法让Rails生成不需要转义的JSON?
答案 0 :(得分:9)
如果您打算使用raw(obj.to_json),您必须确保设置以下内容。
ActiveSupport.escape_html_entities_in_json = true
答案 1 :(得分:5)
我的评论解决了这个问题,只是为了记录:
Rails转义使用<%= 'string' %>
打印的字符串。这样,它就可以保存到输出用户数据。
因此,如果您不希望Rails转义输出,则必须使用raw('string')
明确告诉Rails。
在您的代码中,那将是:
<%= raw(@courses.to_json) %>