2012-12-03 31 views
1

我有學語言的模型,我想所有的語言爲JSON但JSON輸出如下如何在rails中定製json輸出?

[{「語言」:{「created_at」:空,「ID」:1, 「語言」: 「英語」, 「的updated_at」:空}},{ 「語言」:{ 「created_at」:空, 「ID」:2, 「語言」: 「瑞典」, 「的updated_at」:空}}, { 「語言」:{ 「created_at」:空, 「ID」:3, 「語言」: 「德國」, 「的updated_at」:空}},{ 「語言」:{ 「created_at」:空, 「ID」: 4, 「語言」: 「法國」, 「的updated_at」:空}},{ 「語言」:{ 「created_at」:空, 「ID」:5, 「語言」: 「西班牙」, 「的updated_at」:空} },{ 「語言」:{ 「created_at」:空, 「ID」:6, 「語言」: 「荷蘭人」, 「的updated_at」:空}},{ 「語言」:{ 「created_at」:「2012-12 -03T05:01:18Z「,」id「:7,」language「:」Tamil「,」updated_at「:」2012-12-03T05:01:18Z「}}]

,但我想使這個作爲

{ 「語言」:[{ 「created_at」:空, 「ID」:1, 「語言」: 「英語」, 「的updated_at」:空} { 「created_at」:空, 「ID」:2, 「語言」: 「瑞典」, 「的updated_at」:空},{ 「created_at」:空, 「ID」:3, 「語言」: 「德國」, 「的updated_at」:空},{ 「created_at」:空, 「ID」:4, 「語言」: 「法國」, 「的updated_at」:空},{ 「created_at」:空, 「ID」:5,「語言「:」 西班牙語 「 」的updated_at「:空},{ 」created_at「:空, 」ID「:6, 」語言「: 」荷蘭人「, 」的updated_at「:空},{ 」created_at「:空,」 ID 「:7,」language「:」Tamil「,」updated_at「:null}]}

更新

def index 
@languages = Language.all 
respond_to do |format| 
    format.json { render json: @languages} 
end 
end 

更新2

class Language < ActiveRecord::Base 
     ActiveRecord::Base.include_root_in_json = false 
     has_and_belongs_to_many :users 
    end 
+0

顯示控制器代碼 –

+0

不活躍模型序列寶石覆蓋呢? – BKSpurgeon

回答

12

我認爲這應該工作:

format.json { render json: { "language" => @languages.as_json(:root => false) }.to_json } 

這樣做是什麼到@languages數組轉換成JSON格式的哈希車型的陣列,無根鍵(使用as_json),然後包裝結果在使用根鍵「語言」進行散列,然後將該散列轉換爲帶有to_json的JSON格式的字符串。 (參見the docs的詳細信息,包括或不包括使用as_json根節點。)

例如,與模型Post

posts = Post.all 
#=> [#<Post id: 1, name: "foo", title: "jkl", content: "some content", created_at: "2012-11-22 01:05:46", updated_at: "2012-11-22 01:05:46">] 

# convert to array of hashes with no root keys 
posts.as_json(root: false) 
#=> [{"content"=>"some content", "created_at"=>Thu, 22 Nov 2012 01:05:46 UTC +00:00, "id"=>1, "name"=>"foo", "title"=>"jkl", "updated_at"=>Thu, 22 Nov 2012 01:05:46 UTC +00:00}] 

# add root back to collection: 
{ "post" => posts.as_json(root: false) } 
#=> {"post"=>[{"content"=>"some content", "created_at"=>Thu, 22 Nov 2012 01:05:46 UTC +00:00, "id"=>1, "name"=>"foo", "title"=>"jkl", "updated_at"=>Mon, 03 Dec 2012 09:41:42 UTC +00:00}]} 

# convert to JSON-formatted string 
{ "post" => posts.as_json(root: false) }.to_json  
#=> "{\"post\":[{\"content\":\"some content\",\"created_at\":\"2012-11-22T01:05:46Z\",\"id\":1,\"name\":\"foo\",\"title\":\"jkl\",\"updated_at\":\"2012-12-03T09:43:37Z\"}]}" 
+0

這不起作用。它只是添加另一個根語言,它顯示爲{「language」:[{「language」:{「created_at」:null,「id」:1,「language」:「English」,「updated_at」:null}}, {「language」:{「created_at」:null,「id」:2,「language」:「Swedish」,「updated_at」:null}}]} – logesh

+0

如果包含''語言: ':root => false'選項(就是這樣,請參閱[docs](http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json))。我加了另一個根''語言''因爲這就是你想要的。 –

+0

我看到了你提到的文檔,你說得對,但不知道爲什麼這不起作用。但無論如何,謝謝你的迴應。也許它可以爲其他人工作,所以我會標記你的答案被接受。如果您發現其他原因,請告訴我。 – logesh

0

添加自定義JSON輸出當渲染JSON是通過的最簡單的方法使用的寶石,提供了很多的JSON模板 -

https://github.com/fabrik42/acts_as_api

+0

同時檢查它的用法,如果你錯過了這裏它是 - http://fabrik42.github.com/acts_as_api/ –

2

覆蓋上要自定義

模型中的as_json
def as_json options={} 
    { 
     id: id, 
     login: login, 
     name: custom.value, #for custom name 
    ... 
    } 
end 

==> or 

def as_json(options={}) 
    super(:only => [:id, :login, :name ....]) 
end 

來自:here

其他鏈接:here