你如何将所有Sinatra响应设置为JSON?

per*_*nce 2 json sinatra

我已经能够将所有内容类型设置为before块中的JSON ,但是在过滤器之后是否有一个sinatra允许我在所有响应上运行to_json(而不是to_json在下面的示例中写入3次)​​?

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
Run Code Online (Sandbox Code Playgroud)

谢谢!

Kas*_*yap 9

你可以在一个after块中做到这一点:

before do
  content_type :json
end

get '/' do
  { a: 1 }
end

after do
  response.body = JSON.dump(response.body)
end
Run Code Online (Sandbox Code Playgroud)

Sinatra将重新计算更新的正文值的正确内容长度.

另一种方法是使用帮助器:

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

get '/' do
  j({ a: 1 })
end
Run Code Online (Sandbox Code Playgroud)

Sinatra::JSON项目做了同样的事情.此外,您可能希望查看专为构建API(如GrapeGoliath)而设计的库.这两个库提供了一种简单的方法来连接解码器和编码器来处理这种类型的自动转换.