如何将设计中的默认json响应更改为自定义响应?

log*_*esh 2 json ruby-on-rails devise ruby-on-rails-3

我使用设计进行身份验证和注册控制器,如果由于某种原因无法创建用户,那么它会生成json响应

{"email":["已被拍摄"],"密码":["与确认不符"],"用户名":["已被拍摄"]}

但我希望将其更改为以下内容

{"error":{"email":{"已被占用"},"密码":{"与确认不符"},"用户名":{"已被占用"}}}

我怎样才能做到这一点?

qix*_*qix 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
Run Code Online (Sandbox Code Playgroud)

并在你的devise.rb,寻找config.warden部分:

  config.warden do |manager|
    manager.failure_app = CustomFailureApp
  end
Run Code Online (Sandbox Code Playgroud)

一些相关信息:

起初我还以为我将不得不重写设计:: SessionsController,可能使用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