如何告诉rails不为json请求呈现html?

时间:2015-04-14 23:45:13

标签: ruby-on-rails

如果我向我的api端点发出curl请求并且存在问题(在开发中),那么我看到:

>curl --user me:mypassword http://localhost:3000/api/v1/magic_endpoint.json

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>Action Controller: Exception caught</title>
  <style>
  ... stuff
    <body>

    <header>
      <h1>
        ActiveRecord::PendingMigrationError
      </h1>
    </header>
  ... more stuff

这真令人讨厌和讨厌。当json被要求时,如何告诉rails不返回HTML?我在这里看到了许多与此类似的问题,答案是将您的404/500在routes.rb中重定向到自定义错误控制器并手动渲染json,内部错误或“未找到”,但我不想去做。 Rails输出实际错误,在这种情况下, ActiveRecord :: PendingMigrationError ,我不想隐藏它...我只是不想在视觉上解析一堆html标记找出错误是什么。

3 个答案:

答案 0 :(得分:0)

你可以添加

  # Raise exceptions instead of rendering exception templates.
  config.action_dispatch.show_exceptions = false

到您的config/environments/development.rb,但是完全关闭了异常到响应转换,因此您甚至无法获得HTTP状态代码,当然也没有异常的跟踪信息回应者的身体。

我猜你真正想要的是将异常响应转换为“神奇地”#39;仍然发生,但结果是JSON。我不认为股票Rails可以配置为这样做(缺少猴子修补ActionDispatch::ExceptionWrapper,这个特殊的魔法发生在那里)。但是可能有宝石(Ruby库)提供Rails引擎,使Rails能够完成您想要的任务。

是否必须是curl

要探索API实施的行为,编写自动testsrequest specs可能比使用curl手动查询更合适。然后,那些确定所需行为的东西可以保持在开发期间并在运行期间运行,这样他们就可以告诉您行为何时意外地发生变化。

答案 1 :(得分:0)

我认为在您的控制器中您可以执行以下操作:

  rescue_from StandardError do |ex|
    if request.format.json?
      render text: ex.message
    else
      raise ex
    end
  end

但是这样做有一些副作用,例如日志中不会显示异常。 (但你当然可以手动登录)。

答案 2 :(得分:0)

根据das-g的建议,我决定在我的.bashrc中编写一个函数,我称之为“crimp”,因为它与curl有关(哈哈):

crimp() {
  curl $@ | lynx -stdin
}

现在我可以做到:

crimp --user me:secret http://localhost:3000/api/v1/my_endpoint.json

我不再需要阅读令人讨厌的HTML标签了。