Devise::FailureApp
を継承したCustomFailure
を作成, respondメソッドを書き換えてcontent typeがapplication/jsonだったらjson返すようにした. コレ自体がRack appなのか, self.status = 401, という書き換え方で面白い. bodyはとりあえずという感じ.
lib/custom_failure.rb
class CustomFailure < Devise::FailureApp
def respond
if http_auth?
http_auth
# ここのelsif句を追加
elsif request.content_type == "application/json"
self.status = 401
self.content_type = "application/json"
self.response_body = {success: false, error: "Unauthorized"}.to_json
else
redirect
end
end
end
あとlibの読み込み順を先にして,
config/application.rb
config.autoload_paths += %W(#{config.root}/lib)
deviseの設定に加えればok
config/initializers/devise.rb
config.warden do |manager|
manager.failure_app = CustomFailure
end