Как вернуть 404, когда ресурс не найден, вместо HTML - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть этот контроллер:

# frozen_string_literal: true

class MetricsController < ApplicationController
  before_action :set_post, only: [:update]

  def update
    if @post.update(post_params)
      render json: @post
    else
      render json: @post.errors, status: :unprocessable_entity
    end
  end

  private

  def set_post
    @post = Post.find_by(site: params[:site_id], post_id: params[:post_id])
  end

  def post_params
    params.fetch(:post, {})
  end
end

И я хотел бы знать, как я могу вернуть 404 not found, когда @post равно nil. Прямо сейчас @post.update вызывает ошибку, если @post равно nil, а ответом является HTML.

Ответы [ 3 ]

2 голосов
/ 06 ноября 2019

Вы можете использовать ActiveRecord::FinderMethods#find_by!, который вызывает ActiveRecord::RecordNotFound вместо nil, когда запись не найдена, а затем использовать блок rescue_from для обработки ошибки.

class MetricsController < ApplicationController
  rescue_from ActiveRecord::RecordNotFound do |exception|
    # it is up to you create RecordNotFoundSerializer
    serializer = RecordNotFoundSerializer.new exception

    render json: serializer.to_json, status: :not_found
  end

  private

  def set_post
    @post = Post.find_by(site: params[:site_id], post_id: params[:post_id])
  end
end

Вы также можете извлечь обработку ошибок на базовый контроллер (ApplicationController в вашем примере) и централизовать обработку ошибок там.

1 голос
/ 06 ноября 2019

Вы можете добавить проверку и вернуть not_found, если @post равен nil & inorder, чтобы предотвратить сбой вашего приложения, вы можете обработать другие ошибки, добавив блок rescue и вернув желаемый результат оттуда

def update
 return render json: YOUR_ERROR, status: :not_found unless @post
 if @post.update(post_params)
   render json: @post
 else
   render json: @post.errors, status: :unprocessable_entity
 end
rescue StandardError => e
  render json: e, status: :unprocessable_entity
end
0 голосов
/ 06 ноября 2019

Вы можете добавить проверку для @post в действие вашего контроллера и вернуть 404, если оно nil:

def update
  if @post
    if @post.update(post_params)
      render json: @post
    else
      render json: @post.errors, status: :unprocessable_entity
    end
  else
    render json: YourCustomJsonError, status: 404
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...