ruby-on-rails – Custom Devise 401未经授权的回复

我正在为我的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显示重定向非常相似的东西.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...