2015-01-26 114 views
0

我想用兩種不同的方式讓我的json呈現。現在我有as_json方法重寫來顯示JSON形式這樣一個完整的對象:兩種不同的as_json方法

{ 
    prop1: stuff, 
    prop2: stuff, 
    innerthings: { 
     { 
      prop1:stuff, 
      prop2:stuff 
     } 
     { 
      prop1:stuff, 
      prop2:stuff 
     } 
    } 
} 

而且as_json樣子:

#Renders json 
    def as_json(options={}) 
    super(
     :except => [:created_at, :updated_at], 
     :include => [{:innerthings = > { 
       :except => [:created_at, :updated_at] 
}}] 

    ) 
    end 

我也想有第二個選擇渲染是這樣的:當下面的代碼是用來

{ 
    prop1:stuff, 
    prop2:stuff, 
    countinnerthings:10 
} 

目前,我得到的第一個渲染:

respond_to do |format| 
    format.json { render json: @thing} 
end 

我還希望能夠像as_list一樣渲染,我可以在像下面這樣的情況下使用它來呈現對象的簡單列表。

respond_to do |format| 
    format.json { render json: @things.as_list } 
end 

有沒有一種簡單的方法可以在rails上做到這一點?

回答

1

你可以只定義一個as_list方法

def as_list 
    { 
    prop1: "stuff" 
    } 
end 

如果您需要使用包括等,你可以從你的at_list方法調用as_json。如前所述,串行器通常是更好的選擇。

+0

這有效,但我不得不修改我的JSON做類似如果選項== nil || options.count == 0 basicjson else super(選項)結束 – steventnorris 2015-01-26 20:07:21

3

而不是滾動自己的as_json方法。看看ActiveModel Serializers。我認爲它會滿足你的用例並幫助組織你的代碼。

+0

我見過ActiveModel串行器,看看他們的優點;不過,這是一個遺留系統,在序列化器的理解之前就已經開發出來了,目前它不是遷移的選項。 – steventnorris 2015-01-26 19:43:40