Rails 4 は例外ActionDispatch::ParamsParser::ParseError例外を追加しますが、ミドルウェア スタックにあるため、通常のコントローラー環境ではレスキューできないようです。json API アプリケーションでは、標準のエラー形式で応答する必要があります。
この要点は、ミドルウェアを挿入して傍受して応答するための戦略を示しています。このパターンに従って、私は持っています:
アプリケーション.rb:
module Traphos
class Application < Rails::Application
....
config.middleware.insert_before ActionDispatch::ParamsParser, "JSONParseError"
end
end
そしてミドルウェアは次のとおりです。
class JSONParseError
def initialize(app)
@app = app
end
def call(env)
begin
@app.call(env)
rescue ActionDispatch::ParamsParser::ParseError => e
[422, {}, ['Parse Error']]
end
end
end
ミドルウェアなしでテストを実行すると、(仕様):
Failures:
1) Photo update attributes with non-parseable json
Failure/Error: patch update_url, {:description => description}, "CONTENT_TYPE" => content_type, "HTTP_ACCEPT" => accepts, "HTTP_AUTHORIZATION" => @auth
ActionDispatch::ParamsParser::ParseError:
399: unexpected token at 'description=Test+New+Description]'
これはまさに私が期待するものです(私がrescue_fromできないParseError)。
上記のミドルウェアに追加する変更は次のとおりです。
2) Photo update attributes with non-parseable json
Failure/Error: response.status.should eql(422)
expected: 422
got: 200
また、ログは、標準コントローラー アクションが実行され、通常の応答を返していることを示しています (ただし、パラメーターを受信しなかったため、何も更新されませんでした)。
私の質問:
どのように ParseError からレスキューし、カスタム レスポンスを返すことができますか。私は正しい軌道に乗っているように感じますが、完全ではありません。
例外が発生してレスキューされたときに、コントローラーのアクションがまだ進行している理由がわかりません。
--Kip さん、どうもありがとうございました。