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

时间:2012-11-27 05:33:46

标签: ruby-on-rails ruby-on-rails-3 json devise

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

  

{“email”:[“已被拍摄”],“密码”:[“不匹配   确认“],”用户名“:[”已经被拍摄“]}

但我希望将其更改为以下

  

{“error”:{“email”:{“已被占用”},“密码”:{“不   匹配确认“},”用户名“:{”已被占用“}}}

我该怎么做?

4 个答案:

答案 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状态代码,那么在失败的应用程序级别上运行会更好。“

另外https://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated

答案 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