在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 %>;
它看起来很混乱,但是在幕后,也许在铁轨中提到的帮助者会做同样的事情吗?我现在要继续前进,但是我仍然想知道我是否会在这之后被击中。
答案 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。
你应该看看它。