Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将designe中的默认json响应更改为自定义响应?_Ruby On Rails_Ruby On Rails 3_Json_Devise - Fatal编程技术网

Ruby on rails 如何将designe中的默认json响应更改为自定义响应?

Ruby on rails 如何将designe中的默认json响应更改为自定义响应?,ruby-on-rails,ruby-on-rails-3,json,devise,Ruby On Rails,Ruby On Rails 3,Json,Devise,我使用Desive进行身份验证,如果由于某种原因无法创建用户,则在注册控制器中使用Desive生成json响应,如下所示: {“电子邮件”:[“已被使用”],“密码”:[“不匹配” 确认“],“用户名”:[“已采取”]} 但我想把它改成以下内容 {“error”:{“email”:{“已被使用”},“password”:{“未被使用” 匹配确认“}”,用户名“{”已被“}}” 如何执行此操作?您应该创建一个json.erb文件,并在该错误中呈现该文件。 答案告诉你怎么做 respond do |

我使用Desive进行身份验证,如果由于某种原因无法创建用户,则在注册控制器中使用Desive生成json响应,如下所示:

{“电子邮件”:[“已被使用”],“密码”:[“不匹配” 确认“],“用户名”:[“已采取”]}

但我想把它改成以下内容

{“error”:{“email”:{“已被使用”},“password”:{“未被使用” 匹配确认“}”,用户名“{”已被“}}”


如何执行此操作?

您应该创建一个json.erb文件,并在该错误中呈现该文件。 答案告诉你怎么做

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

如果其他人在寻找如何在使用Desive进行失败登录尝试时自定义json错误响应时遇到此问题,请参考,关键是使用您自己的自定义
FailureApp
实现。(也可以使用此方法覆盖某些重定向行为。)

一些相关信息:

起初我认为我必须重写,可能需要使用传递给
warden.authenticate的
recall
选项
,但如前所述,“调用不适用于API请求,仅适用于导航请求。如果您希望自定义http状态代码,则在失败应用程序级别执行此操作会更好。”

另外

扩展自(我不把它作为注释,因为它有格式问题)

您也可以通过重新定义
http\u auth\u body
方法来最小化重写:

class CustomFailureApp < Devise::FailureApp
  def http_auth_body
    return super unless request_format == :json
    {
      success: false,
      error: i18n_message
    }.to_json
  end
end
class CustomFailureApp
实际上,这个“format.json{respond_with_navigational(resource)}”返回了我告诉过的响应,那么我如何将其放入erb文件中,以及如何更改它以生成自定义响应?实际上,这个“format.json{respond_with_navigational(resource)}”返回了我告诉过的响应,那么,如何改变它,使其产生我所要求的自定义响应呢?我不认为{“email”:{“havebehaved”}是一种有效的json格式。我想你想要的是{“email”:“已经收到”}它应该是
i18n\u message
而不是
i18n\u message
。这个问题现在已经解决了
  config.warden do |manager|
    manager.failure_app = CustomFailureApp
  end
class CustomFailureApp < Devise::FailureApp
  def http_auth_body
    return super unless request_format == :json
    {
      success: false,
      error: i18n_message
    }.to_json
  end
end