2

認証にdeviseを使用し、何らかの理由でユーザーを作成できない場合は登録コントローラーで使用し、json応答を次のように生成します

{"メール":["既に使用されています"],"パスワード":["確認と一致しません"],"ユーザー名":["既に使用されています"]}

しかし、これを次のように変更したい

{"エラー":{"メール":{"すでに使用されています"},"パスワード":{"確認と一致しません"},"ユーザー名":{"すでに使用されています"}}}

これどうやってするの?

4

4 に答える 4

8

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 ステータス コードをカスタマイズする場合は、失敗したアプリ レベルでそうする方がうまくいくでしょう。」

またhttps://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated

于 2016-02-09T18:50:23.480 に答える
3

@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
于 2016-11-16T08:17:32.693 に答える
0
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
于 2012-11-27T06:24:37.167 に答える
0

json.erb ファイルを作成し、そのエラーでレンダリングする必要があります。 この回答は、その方法を示しています。

于 2012-11-27T06:19:06.383 に答える