使用ActionController :: Metal处理ActiveRecord :: RecordNotFound

时间:2013-04-12 16:11:44

标签: json ruby-on-rails-3 api

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

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

最近我决定在找不到记录时回复空的结果。 Rails已经从ActiveRecord::RecordNotFound方法抛出Model#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_fromMetal一起使用或从回复中删除HTML?

1 个答案:

答案 0 :(得分: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