为什么ruby的to_json打破了嵌入式javascript?

时间:2012-02-05 05:17:55

标签: php javascript jquery ruby json

问题

在PHP中我会这样做

<html>
<body>
    <script>
        <?php
        $templates = array(
          'result' => file_get_contents('template.html')
          );
          echo '__templates = ' . json_encode($templates) . ';';
          ?>
    </script>
</body>
</html>

所以我在Sinatra做了这个

<!DOCTYPE html>
<html>
<body>
    <script type="text/javascript">
        __templates = <%= get_templates  %>;
    </script>
</body>
</html>

我的Sinatra路线文件如下:

require 'sinatra'
require 'json'
require 'erb'

helpers do
    def get_templates
        {'result' => (erb :template2)}.to_json
    end
end

get '/' do
    erb :index
end

但是当我从jquery中使用__templates对象时,我的javascript对象最终会被破坏。

ruby​​的to_json做了什么,PHP没有?

php结果

{"result":"<!doctype html>\n<html>\n\n<head>\n\t<meta charset=\"UTF-8\">\n\t<title>{{ TITLE }}<\/title>\n\n\t<style type=\"text\/css\">\n\t{{ CSS }}\n\t<\/style>\n<\/head>\n\n<body>\n\n\t{{{ HTML }}}\n\n\t<script src=\"{{{ JSLIB }}}\"><\/script>\n\t<script src=\"{{{ PREFIX }}}\"><\/script>\n\t<script>\n\t\tfunction __run() {\n\t\t\t{{{ JS }}}\n\t\t}\n\t<\/script>\n\n<\/body>\n\n<\/html>"}

红宝石结果

{"result":"<!doctype html>\n<html>\n\n<head>\n    <meta charset=\"UTF-8\">\n    <title>{{ TITLE }}</title>\n\n    <style type=\"text/css\">\n        {{ CSS}}\n    </style>\n</head>\n\n<body>\n\n    {{{ HTML }}}\n\n    <script src=\"{{{ JSLIB }}}\"></script>\n    <script src=\"{{{ PREFIX }}}\"></script>\n    <script>\n        function __run() {\n            {{{ JS }}}\n        }\n    </script>\n\n</body>\n\n</html>\n"};

注意php版本上的<\/body>

解决方案(暂时)

我根据下面发布的评论找到了解决方案。但是,我不确定这是否是“一种真实的方式”,如果存在的话。 注意:我想知道这个实现是否会破坏其他东西。我将在整个申请过程中依赖此功能。

我最终只是使用gsub来解决我的问题。我把它包装成像这样的帮手

helpers do
    def close embedded_json
        embedded_json.gsub('</', '<\/')
    end
    ...
end

并称之为

__templates = <%= close get_templates  %>;
它看起来很混乱,但是在幕后,也许在铁轨中提到的帮助者会做同样的事情吗?我现在要继续前进,但是我仍然想知道我是否会在这之后被击中。

3 个答案:

答案 0 :(得分:2)

这就是那些反斜杠。

JSON中显示</title>之类的内容,实际上需要<\/title>

问题是.to_json没有添加反斜杠。

我们怎样才能成功?

答案 1 :(得分:0)

我认为问题不在于json不是json(在json字符串中没有错误),而是你在html documnt中,所以像</这样的字符具有特殊意义。

我猜它在HTML解析器中看起来是一个狡猾的尝试来关闭文档中的实际body标记。如果你用一个CDATA部分包围json,即

<script type="text/javascript">
//<![CDATA[
  <%= get_templates %>
//]]>
</script>

然后HTML解析器会知道不这样做。在Sinatra可能有帮助者已经做过

答案 2 :(得分:-1)

这可能有点矫枉过正,但当我使用to_json使用Rails时,我讨厌它并找到了RABL https://github.com/nesquena/rabl

你应该看看它。