如何在Rails to_json输出中处理HTML实体?

dB'*_*dB' 7 javascript json ruby-on-rails

我正在编写一个应用程序,它在后端使用Rails,在前端使用javascript/backbone.我正在尝试将一些rails模型引导到我的javascript中.具体来说,我想将内容加载@courses到一个名为的js变量中window.courses.我在html.erb文件中有以下内容.

<%= javascript_tag do %>
    window.courses = JSON.parse('<%= @courses.to_json %>');
<% end %>
Run Code Online (Sandbox Code Playgroud)

我期待erb预处理器将其渲染为有效的javascript,就像这样

<script type="text/javascript">
//<![CDATA[
    window.courses = JSON.parse('[{"code":"myCourseCode", ...
//]]>
</script>
Run Code Online (Sandbox Code Playgroud)

...但是,相反,我得到的代码包含HTML实体.

<script type="text/javascript">
//<![CDATA[
    window.courses = JSON.parse('[{&quot;code&quot;:&quot;myCourseCode&quot;, ...
//]]>
</script>
Run Code Online (Sandbox Code Playgroud)

显然,当我尝试解析时,我收到了javascript错误.

有谁知道如何处理这些HTML实体以生成有效的JavaScript?我意识到一个选择是在客户端上取消实体,但这似乎是一个迂回的解决方案.有没有办法让Rails生成不需要转义的JSON?

ore*_*ake 9

如果你打算使用raw(obj.to_json),你必须确保设置以下内容.

ActiveSupport.escape_html_entities_in_json = true 
Run Code Online (Sandbox Code Playgroud)


Rau*_*nto 5

我的评论解决了这个问题,只是为了记录:

Rails转义使用打印的字符串<%= 'string' %>.这样,它就可以保存到输出用户数据.因此,如果您不希望Rails转义输出,则必须使用明确告诉Rails raw('string').

在您的代码中,这将是: <%= raw(@courses.to_json) %>