22

Rails 3.1 アプリ用の JSON ベースの API に取り組んでいます。デフォルトの代わりにカスタムの失敗応答を提供したいと思います。

{"error":"You need to sign in or sign up before continuing."}

authenticate_user!私の API コントローラーには、この JSON 応答をレンダリングする before_filter への呼び出しが含まれています。

検索中に、この Devise wiki エントリを参照するこの StackOverflow questionに出くわしました。残念ながら、この wiki エントリは、私が何を言っているのかを理解するのに十分なほど詳細ではありません。具体的には、Devise/Warden が私が返したいものをレンダリングすることを知っているように、そのコードをどこに置くべきか手がかりがありません。

他の SA の質問に関するコメントから、custom_failure!1.2 (具体的には 1.4.2) より上のバージョンの Devise を使用しているため、電話する必要がないように思えます。ただし、ウィキのエントリには、独自のレンダリング呼び出しの代わりにそれを使用することrenderを知っているような呼び出しがどこに行くべきかが説明されていません。authenticate_user!

renderこの通話はどこに行きますか?

編集:メッセージ自体を変更しようとしているだけではありません(デバイス構成のようなものen.ymlです)。応答の実際の形式を変更しようとしています。具体的には、これを返したい:

render :text => "You must be logged in to do that.", :status => :unauthorized
4

2 に答える 2

30

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: i18n_message } ].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:52:23.303 に答える
2

エラー メッセージとともに表示されるテキストを変更したいだけの場合は、ロケール ファイル (/config/locales/devise.en.yml) を編集するだけでよいと思います。

より具体的な詳細が必要な場合は、このトピックの RailsCast も役立つ場合があります。http://railscasts.com/episodes/210-customizing-deviseで見つけることができます

于 2011-09-05T23:08:33.277 に答える