哪里vs在Rails中查找Api

时间:2017-06-22 08:18:38

标签: ruby-on-rails exception-handling ruby-on-rails-5

假设我有一个学生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的更好方法。

4 个答案:

答案 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

好处:

  1. 如评论中所述,不需要进行无休止的nil检查。
  2. 避免不必要的异常处理。
  3. 返回更具信息性的错误消息。

答案 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

doc for status list

你可以在标题上使用rescue_from,但这适用于每个动作

rescue_from ActiveRecord::RecordNotFound,with: action_name