2010-05-27 123 views
4

我試圖在我的一個模型中重寫as_json,部分是爲了包含來自另一個模型的數據,部分是爲了去掉一些不必要的字段。從我讀過這是Rails的3首選方法爲了簡單起見,假設我有這樣的:覆蓋as_json沒有效果?

class Country < ActiveRecord::Base 
    def as_json(options={}) 
    super(
     :only => [:id,:name] 
    ) 
    end 
end 

,並在我的控制器只需

def show 
    respond_to do |format| 
    format.json { render :json => @country } 
    end 
end 

然而,無論我嘗試,輸出始終包含完整的數據,這些字段不會被「:only」子句過濾。基本上,我重寫似乎沒有踢,但如果我把它改變,比方說......

class Country < ActiveRecord::Base 
    def as_json(options={}) 
    {foo: "bar"} 
    end 
end 

...我真的不得到預期的JSON輸出。我的語法錯了嗎?

+0

順便說一句 - 我得到這個閱讀後遠http://jonathanjulian.com/2010/04/rails-to_json-or-as_json/ – 2010-05-27 21:01:41

+0

參見http://stackoverflow.com/questions/2556468/override-as-json-or-to-json-model-class-name – 2010-05-28 02:48:41

+0

和https://rails.lighthouseapp.com/projects/8994/tickets/ 3087 – 2010-07-17 17:33:48

回答

0

一些進一步的測試,在控制器動作:

format.json { render :json => @country } 

和模型:

class Country < ActiveRecord::Base 
    has_many :languages 
    def as_json(options={}) 
     super(
      :include => [:languages], 
      :except => [:created_at, :updated_at] 
     ) 
    end 
end 

輸出:

{ 
    created_at: "2010-05-27T17:54:00Z" 
    id: 123 
    name: "Uzbekistan" 
    updated_at: "2010-05-27T17:54:00Z" 
} 

然而,明確加入.to_json()來該類中的render語句以及在模型中重寫to_json(而不是as_json)會生成期望的重新生成SULT。有了這個:

format.json { render :json => @country.to_json() } 

在我的控制器動作,和模型下的,倍率工作:

class Country < ActiveRecord::Base 
    has_many :languages 
    def to_json(options={}) 
     super(
      :include => [:languages], 
      :except => [:created_at, :updated_at] 
     ) 
    end 
end 

輸出...

{ 
    id: 123, 
    name: "Uzbekistan", 
    languages: [ 
     {id: 1, name: "Swedish"}, 
     {id: 2, name: "Swahili"} 
    ] 
} 

...這是預期產出。我發現了一個錯誤?我贏得獎品嗎?

+0

你有沒有定義自己的'to_json'或'as_json'的插件或其他東西? – x1a4 2010-05-28 02:47:52

+0

不是我所知道的,只有安裝了Ward,Devise和CanCan的插件... – 2010-05-28 03:34:50