3

我正处于开发(JSON)API 阶段并决定继承我ApiController的 fromActionController::Metal以利用速度等。

所以我已经包含了一堆模块来使它工作。

最近我决定在找不到记录时以空结果响应。Rails 已经ActiveRecord::RecordNotFoundModel#find方法中抛出,我一直在尝试使用rescue_from它来捕获它并编写如下内容:

module Api::V1
  class ApiController < ActionController::Metal
    # bunch of included modules 

    include ActiveSupport::Rescuable

    respond_to :json

    rescue_from ActiveRecord::RecordNotFound do
      binding.pry
      respond_to do |format|
        format.any { head :not_found }
      end
    end
  end
end  

在调用我的简单动作之后

def show
  @post = Post.find(params[:id])
end

并且执行永远达不到rescue_from。它的抛出:

ActiveRecord::RecordNotFound (Couldn't find Post with id=1

进入我的日志文件。

我一直在尝试它并处于生产模式。服务器以 404 响应,但响应正文是JSON请求的标准HTML错误页面。

当我将继承从 更改为 时效果ActionController::Metal很好ActionController::Base

您可能会注意到缺少respond_with呼叫。那是因为我使用RABL作为我的模板系统。

所以问题是:是否有机会rescue_from使用Metal或摆脱响应中的 HTML?

4

1 回答 1

6

以下对我有用:

class ApiController < ActionController::Metal
  include ActionController::Rendering
  include ActionController::MimeResponds
  include ActionController::Rescue

  append_view_path Rails.root.join('app', 'views').to_s
  rescue_from ActiveRecord::RecordNotFound, with: :four_oh_four

  def four_oh_four
    render file: Rails.root.join("public", "404.html"), status: 404
  end
end
于 2013-05-01T19:16:18.780 回答