我正处于开发(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_from
与Metal
一起使用或从回复中删除HTML?
答案 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