ruby 如何在Rails中为404响应添加错误消息?

2vuwiymt  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(135)

我需要在404错误的响应中添加一个错误消息。我在控制器中有一些方法:

def method
    *some logic*

    if something.present?
      render json: something, serializer: SomeSerializer
    else
      render json: { errors: I18n.t('errors.something.no_something') }, status: :not_found
    end
  end

但是当我通过 Postman 发出请求时,项目的404页面就会显示出来,没有错误输出
如何显示特定的错误?

piv4azn7

piv4azn71#

Ruby on Rails在引发特定异常(例如ActionController::RoutingErrorActiveRecord::RecordNotFound)时自动返回默认的404 not found错误页面。
在您的代码示例和您的描述中,很可能在实际达到if something.present?条件之前,代码中的某个位置已经引发了ActiveRecord::RecordNotFound
一个简单的解决方案可能是从该异常中解救出来,并在控制器方法中返回自定义错误消息,如下所示:

def method
  *some logic*
  
  render json: something, serializer: SomeSerializer
rescue ActiveRecord::RecordNotFound
  render json: { errors: I18n.t('errors.something.no_something') }, status: :not_found
end

结束
另一种选择是从数据库中加载记录,在未找到时不会引发ActiveRecord::RecordNotFound异常,而是自己处理丢失的记录。
当然,这看起来是什么样的,取决于您的特定代码(您没有共享)。如果你有这样的代码:

something = Something.find(params[:id]) # raises exception when not found

你可以把它改成:

something = Something.find_by(id: params[:id]) # returns nil when not found

if something.present?
  render json: something, serializer: SomeSerializer
else
  render json: { errors: I18n.t('errors.something.no_something') }, status: :not_found
end

相关问题