22

我正在为我的 Rails 3.1 应用程序开发基于 JSON 的 API。我想提供自定义失败响应而不是默认响应,即:

{"error":"You need to sign in or sign up before continuing."}

我的 API 控制器包含对 的 before_filter 调用authenticate_user!,这就是呈现此 JSON 响应的原因。

在搜索时,我遇到了这个 StackOverflow 问题,它引用了这个 Devise wiki 条目。不幸的是,wiki 条目不够详细,我无法理解它告诉我的内容。具体来说,我不知道应该将该代码放在哪里,以便设计/监狱长知道呈现我想要返回的内容。

从对另一个 SA 问题的评论来看,听起来我不需要打电话custom_failure!,因为我使用的是高于 1.2 的 Devise 版本(具体来说是 1.4.2)。但是,wiki 条目没有解释render调用应该去哪里,以便authenticate_user!知道使用它而不是它自己的渲染调用。

这个render电话去哪儿了?

编辑:我不只是试图改变消息本身(一个 la 设计en.yml配置);我正在尝试更改响应的实际格式。具体来说,我想返回这个:

render :text => "You must be logged in to do that.", :status => :unauthorized
4

2 回答 2

30

作为参考,以防其他人在使用 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,可能使用recall传递给的选项,但正如这里warden.authenticate!提到的,“API 请求不会调用调用,仅用于导航请求。如果你想自定义 http 状态代码,在失败的应用程序级别这样做你会有更好的运气。”

此外https://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated显示了非常相似的重定向.

于 2016-02-09T18:52:23.303 回答
2

如果您只是想更改显示错误消息的文本,我相信您可以编辑语言环境文件(/config/locales/devise.en.yml)。

如果您想要更具体的细节,关于这个主题的 RailsCast 也可能会有所帮助。您可以在http://railscasts.com/episodes/210-customizing-devise找到它

于 2011-09-05T23:08:33.277 回答