2009-07-31 17 views
4

RESTfulインターフェイスを持つRailsアプリケーションは、 'application/json'に基づいてカスタムMIMEタイプを使用してPOSTデータを受け入れる必要があります。 MIMEタイプ 'application/vnd.com.example.Foo + json'を呼び出してみましょう。カスタムMIMEタイプ使用時にRailsでJSONペイロードを解析する

Mime :: Type.registerを使用してカスタムMIMEタイプを登録すると、「Accept:」ヘッダーに指定されているMIMEタイプが認識され、respond_toを介してJSONビューがレンダリングされます。

問題は、カスタムJSON形式のデータをparamsハッシュに変換する必要がある、コントローラのメソッド(updateやcreateなど)です。 "Content Type:"ヘッダーをapplication/jsonに設定すると、データはparamsハッシュに解析されます。

しかし、「コンテンツタイプ:」ヘッダーを「applcation/vnd.com.example.Foo + json」に設定した場合、ペイロードは解析されません。

MIME :: Type.registerはrespond_toブロックの駆動に使用されますが、作成および更新メソッドのペイロードの解析方法の決定には使用されていないようです。

アイデア?

答えて

6

興味のある方には、私自身の質問に対する答えを見つけました。

使用mime_types.rb(あるいは他の場所であなたのあなたの初期化シーケンスなど)でこのような何か:

ActionController::Base.param_parsers[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body| 
    JSON.parse body 
end 

ワンキャッチ:(すなわち、「アプリケーション上記のMIMEタイプに大文字と小文字を使用していません/vnd.com.example.Foo+json ')。 RailsはMIMEタイプをすべて小文字に変換するので、大文字に設定されたマッチは見つかりません。 Railsの3で

+1

はルックス: 'ActionDispatch :: Request.parameter_parsers [マイム: :Type.lookup( 'application/vnd.com.example.foo + json')] =ラムダ{| raw_post | ActiveSupport :: JSON.decode(raw_post)} ' –

4

は行いますRailsの5では

ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::Type.lookup('application/vnd.com.example.foo+json')]=lambda do |body| 
    JSON.parse(body) 
end 
3

の操作を行います。それはRailsの5に少し異なる場合がありますように

ActionDispatch::Request.parameter_parsers[Mime::Type.lookup('application/vnd.api+json').symbol] = lambda do |body| 
    JSON.parse(body) 
end 
関連する問題