私は Rails 3.1 アプリ用の JSON ベースの API に取り組んでいます。デフォルトの代わりに、次のようなカスタムの失敗応答を提供したいと思います。
{"error":"You need to sign in or sign up before continuing."}
私の API コントローラーには、への before_filter 呼び出しが含まれておりauthenticate_user!
、これがこの JSON 応答をレンダリングします。
検索中に見つけたこのStackOverflowの質問、参照このDevise wikiエントリ残念ながら、Wiki エントリは詳細が足りず、何を言っているのか理解できません。具体的には、Devise/Warden が返したいものをレンダリングできるように、コードをどこに配置すればよいのか全くわかりません。
他の SA の質問のコメントから、私は 1.2 以上のバージョンの Devise (具体的には 1.4.2) を使用しているので、 を呼び出す必要はないようです。ただし、Wiki エントリでは、独自のレンダリング呼び出しの代わりにそれを使用するように、呼び出しをどこに行うべきかcustom_failure!
は説明されていません。render
authenticate_user!
このrender
電話はどこに行きますか?
編集:メッセージ自体を変更しようとしているのではなく (devise en.yml
config のように)、応答の実際の形式を変更しようとしています。具体的には、次のものを返したいのです:
render :text => "You must be logged in to do that.", :status => :unauthorized
ベストアンサー1
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::セッションコントローラおそらくはrecall
に渡されたオプションを使用するwarden.authenticate!
が、前述のようにここ「リコールは API リクエストに対しては呼び出されず、ナビゲーション リクエストに対してのみ呼び出されます。http ステータス コードをカスタマイズする場合は、失敗アプリ レベルで行った方がよいでしょう。」
またhttps://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticatedリダイレクトについても非常によく似たものを示しています。