Ruby on rails 如何将designe中的默认json响应更改为自定义响应?
我使用Desive进行身份验证,如果由于某种原因无法创建用户,则在注册控制器中使用Desive生成json响应,如下所示: {“电子邮件”:[“已被使用”],“密码”:[“不匹配” 确认“],“用户名”:[“已采取”]} 但我想把它改成以下内容 {“error”:{“email”:{“已被使用”},“password”:{“未被使用” 匹配确认“}”,用户名“{”已被“}}”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 |
如何执行此操作?您应该创建一个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