2011-01-19 77 views
2

我有一个属性ID和电子邮件 @clients的集合,我想使这个JSON格式轨道3 JSON定制JSON格式

[ 
{"id":" 1","label":"[email protected]","value":"1"},{"id":" 2","label":"[email protected]","value":"2"} 
] 

在clients_controller我定义了以下方法

def search 
    @clients = Client.where(:user_id => current_user.id).select('id','email') 
    render :partial => "clients/search" 
    end 

这里是视图_search.json.erb

[ 
<%= raw @client.map{|client| '{"id":"' +" #{client.id}" +'","label":"' + "#{client.email}" + '","value":"' +"#{client.id}" +'"}' }.join(",") %> 
] 

这是工作,但我发现它很难...有没有一种更优雅的方式来在视图中生成自定义json格式?

回答

6

你只需要使用to_json方法。在你情况下,它

@client.to_json(:only => [:id, :label, :value]) 
+0

这不适合我需要的自定义输出格式。我澄清了我的问题,还有其他想法吗? – Alpha 2011-01-19 18:42:16

+0

`@ client.to_json(...)`输出标准的json。你可以澄清你的意思*定制*?如果你的意思是改变空格,换行等,那么你的解决方案是正确的。但是,你不应该需要为json制作自定义输出,否则你不会谈论标准化的json。 – Sukima 2012-06-11 18:22:59

7

使用您从视图调用辅助功能格式化你从控制器调用输出或库函数。例(后):

def search 
    @clients = Client.where(:user_id => current_user.id).select('id','email') 
    respond_to do |format| 
    format.html 
    format.json do 
     render :json => custom_json_for(@clients) 
    end 
    end 
end 

private 
def custom_json_for(value) 
    list = value.map do |client| 
    { :id => " #{client.id}", 
     :label => client.email.to_s, 
     :value => client.id.to_s 
    } 
    end 
    list.to_json 
end 
0

您可以使用https://github.com/dewski/json_builder/自定义视图的JSON响应,并从控制器分开。这是很好的,当你需要添加一些 “当前用户” 根据属性,如

[{:attending => event.attending?(current_user)}] 
1

你可以使用jBuilder宝石从GitHub

为clients_controller

def search 
    @clients = Client.where(:user_id => current_user.id) 
end 

和search.json.jbuilder

json.id @clients.id 
json.label @clients.email 
json.value @clients.id 

欲了解更多信息您可以访问Jbuilder on RailsCast