我使用设计进行身份验证,在注册控制器中,如果由于某种原因无法创建用户,那么它会生成json响应
{“email”:[“已被拍摄”],“密码”:[“不匹配 确认“],”用户名“:[”已经被拍摄“]}
但我希望将其更改为以下
{“error”:{“email”:{“已被占用”},“密码”:{“不 匹配确认“},”用户名“:{”已被占用“}}}
我该怎么做?
答案 0 :(得分:5)
如果在使用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::SessionsController,可能使用传递给recall
的{{1}}选项,但如上所述here,“不会调用API请求,仅适用于导航请求。如果您想自定义http状态代码,那么在失败的应用程序级别上运行会更好。“
答案 1 :(得分:1)
从@quix answer延伸(我不会留下评论,因为它有格式问题)。
您还可以最小化覆盖重新定义http_auth_body
方法:
class CustomFailureApp < Devise::FailureApp
def http_auth_body
return super unless request_format == :json
{
success: false,
error: i18_message
}.to_json
end
end
答案 2 :(得分:0)
您应该创建一个json.erb文件并在该错误中呈现该文件。 This回答告诉你如何做到这一点。
答案 3 :(得分: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