2014-12-25 26 views
2

我已經能夠在before塊中將我的所有內容類型設置爲JSON,但在過濾器後面是否存在sinatra,允許我在所有響應中運行to_json(而不是在我的示例中編寫to_json 3次下面)?你如何將你所有的Sinatra響應設置爲JSON?

require 'sinatra' 
require 'json' 

before do 
    content_type :json 
end 

get '/' do 
    { song: "Hello" }.to_json 
end 

get '/go' do 
    { song: "Go Yo Ho" }.to_json 
end 

get '/hi' do 
    { song: "Wake me Up" }.to_json 
end 

謝謝!

回答

4

你可以做的是,在after塊:

before do 
    content_type :json 
end 

get '/' do 
    { a: 1 } 
end 

after do 
    response.body = JSON.dump(response.body) 
end 

西納特拉將重新計算更新的體值正確的內容長度。

的另一種方法是使用一個幫手:

helper do 
    def j(data) 
    JSON.dump(data) 
    end 
end 

get '/' do 
    j({ a: 1 }) 
end 

Sinatra::JSON項目做同樣的事情。另外,您可能需要查看爲構建API如GrapeGoliath而設計的庫。這兩個庫提供了一種簡單的方法來連接解碼器和編碼器來處理這種類型的自動轉換。

相關問題