2013-08-07 44 views
1

我想知道有沒有人可以幫忙。我試圖將我們的舊版Rails Model#to_json移植到我們的API中,以便從更長遠的角度來簡化版本管理。由於Rabl和Will Paginate,我在第一個障礙中掙扎。Rabl/Will Paginate設置根子的名字

我們目前覆蓋WillPaginate ::收藏#as_json

module WillPaginate 
    class Collection 

    alias :as_json_without_paginate :as_json 

    def as_json(options = {}) 

     # RABL seemingly passing JSON::Ext::Generator::State into as_json 
     unless options.is_a?(Hash) 
     options = {} 
     end 

     json = { 
     :page => current_page 
     :per_page => per_page, 
     :total_entries => total_entries, 
     :entries => as_json_without_paginate(options) 
     } 
    end 

    end 
end 

所以@ collection.to_json將返回類似

{ 
    "total_entries": 1, 
    "page": 1, 
    "entries": [ 
    { 
     "follow": { 
     "id": 1, 
     "name": "TEST" 
     } 
    } 
    ], 
    "per_page": 10 
} 

然而,當我嘗試做Rabl的

node(:page) {|m| @follows.current_page } 
node(:per_page) {|m| @follows.per_page } 
node(:total_entries) {|m| @follows.total_entries} 

child(@follows => :entries) do 
    # extends 'follows/show' 
    attributes :id, :name 
end 
以下

孩子的名字自動設置爲'entry',我想將它設置爲'follow'來與我們目前的API保持一致,但沒有任何運氣。

{ 
    "total_entries": 1, 
    "page": 1, 
    "entries": [ 
    { 
     "entry": { 
     "id": 1, 
     "name": "TEST" 
     } 
    } 
    ], 
    "per_page": 10 
} 

任何人都可以給我任何指針。我一直試圖追溯源代碼,似乎總是隱含着子對象名稱的名稱。

回答

0

:object_root => false添加到您的child塊應該這樣做。

child(@follows => :entries, :object_root => false) do 
    # extends 'follows/show' 
    attributes :id, :name 
end 
2

我遇到了同樣的確切的錯誤,問題似乎是將object_root設置爲false。這裏是我的迴應提出的另一個問題計算器相同的解決方案: wrong child root name in rabl and can't set child root name

child({@follow => :entries}, {:object_root => false}) do 
    # extends 'follows/show' 
    attributes :id, :name 
end 

注意兩個圓括號「()」和大括號「{}」。

希望這會有所幫助。它在我的情況下完美運作。