2011-04-04 85 views
0

我有一个json对象,它是从多个数据库查询的结果创建的。呈现部分为json在换行符返回语法错误

我想将json移动到一个部分,所以我可以使用多种方法(索引,搜索)相同的json格式。

我有我的成绩在_listResults.js.erb,并搬到现在他们进入results.json.erb和_listResults.js.erb我有

 
[ 
<% @results.each_with_index do |result, idx| %> 
<%= render 'results.json.erb', result => result %> 
<% end %> 
] 

我的部分看起来像这样

 
{"result":<%= result.id %> 
,"title":"<%= result.title %> 
..... 

由于换行,我收到说

 
... syntax error, unexpected ',', expecting keyword_end...);@output_buffer.safe_concat(',"title":');@output_buffer.a... 

虽然我可以把整个的错误json输出成一行,看起来这样可以解决问题,如果我想稍后改变输出,那将会很难维持。

什么是处理这类事情的最好方法。

我在Windows上,如果重要的话(希望它不会)。

感谢

+0

最好的方法是不要手动构建您的JSON并在您的控制器中使用to_json/as_json来返回适当的对象。 – Eric 2011-04-04 20:29:11

回答

0

什么:

{"result":<%= result.id %>, 
"title":"<%= result.title %>" 
... 

仅供参考,http://www.jsonlint.com/是伟大的网站,在这里你可以查看你的JSON是否是有效的。

+0

问题是没有错误的JSON,所以jsonlint不会帮助。这只有一次我把它放入局部。将','添加到上面的行只能解决问题,直到我点击':',这就是我的评论'我可以把整个json输出放到一行'的意思。 – pedalpete 2011-04-04 19:13:22

+0

你甚至尝试过我建议的吗? – apneadiving 2011-04-04 19:21:49

+0

是的,我曾尝试过在你提出这个建议之前,如果我按照你的格式,它会在':'处打断,正如我评论的那样。如果我将':'移动到同一行,那么我将达到一切都在一行上的程度。然后它会嵌套在'{'上。我认为有一个更好的方法来做到这一点。 – pedalpete 2011-04-04 20:07:48

0

问题不在于json,而在于ruby解析器的工作方式,在这种情况下,它需要在同一行上有逗号。

[0, 
2 
] parses 

[0 
,2] doesn't 

您的ERB改变

{ 
    "result": <%= result.id %>, 
    "title": "<%= result.title %>" 
} 
+0

感谢James,不幸的是,这只有在我为嵌套对象命中'{'时才有效。它似乎并不在乎这是否在一条线的末端,或线路的起点或其他地方。 – pedalpete 2011-04-04 19:26:14

+0

嗯我正在做同样的事情,我唯一的区别是我的局部视图是.html.erb。它被称为_data.html.erb。并从index.html.erb <%= render:partial =>'data'%> – 2011-04-04 19:37:52

0

您的原始文件ERB语法错误,result => result应该是:result => result

[ 
<% @results.each_with_index do |result, idx| %> 
<%= render 'results.json.erb', :result => result %> 
<% end %> 
] 
+0

我不这么认为。 :result => result返回一个空集。如果我不包含结果=>结果,我会得到一个'未定义的局部变量'错误。 – pedalpete 2011-04-04 19:50:23

+0

'result => result'仅仅是无效的,render期望散列选项。使用'result => result'您提供一个具有相同键和值的散列,这不是一个有效的选项。 – 2011-04-06 09:30:28