假设我有一个学生Rails API,其端点看起来像http://www.example.com/students/1
实施的首选方式是什么?
review = Review.find(inputs[:review_id])
To handle exceptions,
rescue_from Exception, :with => :internal_error
def internal_error(e)
render json: {error: {message: "Internal Error"} }, :status => 500
end
OR
review = Review.where(inputs[:review_id]).first
if review.nil?
render json: {error: {message: "Internal Error"} }, :status => 500
end
我的问题是通过网址处理不存在的id的更好方法。
答案 0 :(得分:3)
你应该采用第一种方法
# reviews_controller.rb
review = Review.find(inputs[:review_id])
和
# application_controller.rb
# rescue_from Exception, :with => :internal_error
# OR Prefer ActiveRecord::RecordNotFound
rescue_from ActiveRecord::RecordNotFound, :with => :internal_error # Prefer this one
def internal_error(e)
render json: {error: {message: "Internal Error"} }, :status => 500
end
要将其设为通用,请将其添加到application_controller.rb
注意:强>
答案 1 :(得分:2)
您可以在基本控制器中添加全局rescue_from
(例如ApplicationController
),然后使用find
方法(仅检索一条记录的最佳方法):
rescue_from ActiveRecord::RecordNotFound do |e|
render status: :not_found, json: { error: { message: e.message } }
end
每次尝试检索记录时,如果他不存在,您将呈现错误消息和404状态,代表不存在的资源。
答案 2 :(得分:0)
都不是。你可以这样做:
unless review = Review.find_by(id: inputs[:review_id])
render json: {error: {message: "record not found"} }, status: :not_found
end
好处:
nil
检查。答案 3 :(得分:0)
您应该使用rescue来管理错误
def action_name
review = Review.find(inputs[:review_id])
render json: review, status: :ok
rescue # for ever not found
render json: {}, status: :not_found,nothing: true
end
你可以在标题上使用rescue_from,但这适用于每个动作
rescue_from ActiveRecord::RecordNotFound,with: action_name