Rails3:控制生成的JSON(to_json with datamapper ORM)

时间:2010-09-18 15:41:28

标签: json ruby-on-rails-3 datamapper

从我的Rails 3应用程序中我想要一个像这样的JSON:     {数:10,      图片:[                 {ID:1},      ...]} 我试过了

render( :json => { :count => 10, :pictures => @pictures.to_json(:only=>:id) } )

但在这种情况下,我的照片会被转义

..."pictures":"[{\"id\":2653299}, ....

在我的旧merb应用程序中,我的控制器中有以下简单的行:

    display( { :count=>@count, :pictures => @pictures } ) 

因为我使用datamapper作为我的ORM和dm-serializer我不知道在哪里影响生成的json。

2 个答案:

答案 0 :(得分:0)

尝试使用“原始”功能。默认情况下,Rails 3在视图中转义输出。尝试这样的事情:

raw render( :json => { :count => 10, :pictures => @pictures.to_json(:only=>:id) } )

或者有可能在渲染函数内逃避它(虽然,我从未尝试过这个):

render( :json => { :count => 10, :pictures => raw(@pictures.to_json(:only=>:id)) } )

答案 1 :(得分:0)

您的代码应为:

render( :json => {:count => 10, :pictures => @pictures })

没有在@pictures上显式调用to_json(与你的merb应用程序中的相同)。

但是,如果没有此提交,这将在dm-1.0中炸弹:http://github.com/datamapper/dm-serializer/commit/64464a03b6d8485fbced0a5d7150be90b6dcaf2a

我想它很快就会发布,但与此同时它很容易修补。

修改

我忽略了你想要使用的事实:only =>你收藏的[:id]。它看起来像:as_json由于某种原因尚未在集合中实现。你可以通过几种方式解决这个问题。您的示例可能如下所示:

render( :json => {:count => 10, :pictures => @pictures.map {|p| p.as_json(:only => [:id])}} )

这会将您的Picture集合转换为ID哈希。然后渲染将正确地执行它,你应该得到你想要的结果。 (希望)