認証にdeviseを使用し、何らかの理由でユーザーを作成できない場合は登録コントローラーで使用し、json応答を次のように生成します
{"メール":["既に使用されています"],"パスワード":["確認と一致しません"],"ユーザー名":["既に使用されています"]}
しかし、これを次のように変更したい
{"エラー":{"メール":{"すでに使用されています"},"パスワード":{"確認と一致しません"},"ユーザー名":{"すでに使用されています"}}}
これどうやってするの?
認証にdeviseを使用し、何らかの理由でユーザーを作成できない場合は登録コントローラーで使用し、json応答を次のように生成します
{"メール":["既に使用されています"],"パスワード":["確認と一致しません"],"ユーザー名":["既に使用されています"]}
しかし、これを次のように変更したい
{"エラー":{"メール":{"すでに使用されています"},"パスワード":{"確認と一致しません"},"ユーザー名":{"すでに使用されています"}}}
これどうやってするの?
Deviseを使用してログイン試行が失敗したときにjsonエラー応答をカスタマイズする方法を探しているときに、他の誰かがこの質問に出くわした場合の参考のために、重要なのは独自のカスタムFailureApp
実装を使用することです. (このアプローチを使用して、一部のリダイレクト動作をオーバーライドすることもできます。)
class CustomFailureApp < Devise::FailureApp
def respond
if request.format == :json
json_error_response
else
super
end
end
def json_error_response
self.status = 401
self.content_type = "application/json"
self.response_body = [ { message: "Your email or password is incorrect."} ].to_json
end
end
で、次のセクションdevise.rb
を探します。config.warden
config.warden do |manager|
manager.failure_app = CustomFailureApp
end
関連情報:
最初は、おそらくDevise::SessionsControllerrecall
に渡されたオプションを使用してオーバーライドする必要があると思いましたが、ここwarden.authenticate!
で述べたように、「recall は API リクエストに対しては呼び出されず、ナビゲーション リクエストに対してのみ呼び出されます。http ステータス コードをカスタマイズする場合は、失敗したアプリ レベルでそうする方がうまくいくでしょう。」
@quix answerからの拡張(フォーマットの問題があるため、コメントとして残していません)。
http_auth_body
メソッドを再定義するだけでオーバーライドを最小限に抑えることもできます。
class CustomFailureApp < Devise::FailureApp
def http_auth_body
return super unless request_format == :json
{
success: false,
error: i18n_message
}.to_json
end
end
respond do |format|
format.json { render json: {error: @your_model.errors }}
end
または多分あなたは試してみるべきです
respond do |format|
format.json { render json: {error: Hash[@your_model.errors.map {|k, v| k, v[0]] } }}
end
json.erb ファイルを作成し、そのエラーでレンダリングする必要があります。 この回答は、その方法を示しています。