我正在为我的Rails 3.1应用程序编写一个基于
JSON的API.我想提供自定义的失败响应而不是默认值,它是:
{"error":"You need to sign in or sign up before continuing."}
我的API控制器包含一个before_filter调用authenticate_user!,这是渲染此JSON响应的内容.
在搜索时,我遇到了this StackOverflow question,引用了this Devise wiki entry.不幸的是,wiki条目并不足以让我理解它告诉我什么.具体来说,我不知道我应该把代码放在哪里,这样Devise / Warden知道要渲染我想要的东西.
从其他SA问题的意见来看,听起来我不需要调用custom_failure!因为我使用的Devise版本高于1.2(1.4.2是具体的).但是,wiki条目并不能解释render调用应该在哪里,所以authenticate_user!知道使用它而不是自己的渲染调用.
这个渲染呼叫在哪里去?
编辑:我不只是想改变消息本身(一个设计en.yml配置);我正在尝试更改响应的实际格式.具体来说,我想回报一下:
render :text => "You must be logged in to do that.",:status => :unauthorized
解决方法
为了参考,如果任何人在使用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: i18n_message } ].to_json end end
在你的devise.rb中,查找config.warden部分:
config.warden do |manager| manager.failure_app = CustomFailureApp end
一些相关信息:
起初我以为我必须覆盖Devise::SessionsController,可能使用传递给warden.authenticate!的召回选项,但是如上所述here,“只有导航才能调用API请求,如果要自定义http状态代码,你会有更好的运气,在失败的应用程序级别.
另外https://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated显示重定向非常相似的东西.