コンテンツタイプがアプリケーション/JSONである場合、JSONでラック出力を自動的にエンコードします

StackOverflow https://stackoverflow.com/questions/3423905

質問

モジュラーシナトラアプリを手に入れました。コンテンツタイプが指示するときに、JSONとして出力をエンコードしたいと思います。現時点では、私は自分のルートで手動でそうしています:

get 'someroute' do
    # content-type is actually set with a before filter
    # included only for clarity
    content_type 'application/json', :charset => 'utf-8'
    # .. #
    {:success=>true}.to_json
end

私はそれが次のようになることを望んでいます:

get 'someroute' do
    content_type 'application/json', :charset => 'utf-8'
    # .. #
    {:success=>true}
end

また、ラックミドルウェアを使用して、適切なコンテンツタイプを検出した場合はエンコードを行いたいと思います。

私は以下を動作させようとしてきましたが、役に立たない(コンテンツの長さがボークになっている - JSONエンコードされたコンテンツではなく、オリジナルコンテンツのコンテンツレングスを返します):

require 'init'

module Rack
  class JSON
    def initialize app
      @app = app
    end
    def call env
      @status, @headers, @body = @app.call env
      if json_response?
        @body = @body.to_json
      end
      [@status, @headers, @body]
    end
    def json_response?
      @headers['Content-Type'] == 'application/json'
    end
  end
end

use Rack::JSON

MyApp.set :run, false
MyApp.set :environment, ENV['RACK_ENV'].to_sym

run MyApp

私を軌道に乗せるためのポインターはありますか?

役に立ちましたか?

解決

あなたはすべてを正しく持っていますが、一つのこと:ラックは体が応答するオブジェクトであることを期待しています each しかし、文字列ではありません。あなたの体を配列内に置くだけです。

おそらく必要ではありませんが、コンテンツの長さを手で設定する場合は、ヘッダーに追加するだけです。

if json_response?
  @body = [@body.to_json]
  @headers["Content-Length"] = @body[0].size.to_s
end
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top