#ruby-on-rails
Вопрос:
У меня есть API Rails 5.2.3, который используется приложением Vue, которое я поддерживаю.
В API у меня есть Questions
таблица, и у каждой Question
есть своя специфика type
. Я создаю функцию, в которой мои пользователи могут создавать свои собственные пользовательские вопросы из нескольких выбранных вариантов типов вопросов, для простоты предположим, что у них есть только 2 варианта на выбор: OpenEnded
вопрос и StarRating
вопрос.
Хотя я понимаю, что риск плохой пользовательский ввод здесь невозможно (так как на стороне клиента вещи, я просто ставлю их перечень и поставлять на этот контрольный список к API), я все еще хотел бы иметь некоторые проверки на месте, чтобы гарантировать, что только type
разрешенного в параметры OpenEnded
и StarRating
, особенно, поскольку я планирую расширять этот API, чтобы быть общедоступной в какой-то момент в будущем, где риск плохого входного действительно возможно.
Каков правильный способ обработки этого, чтобы мой API возвращал 400
422
код или, если вопрос type
не входит в белый список вариантов?
Текущий create
метод и question_params
метод примерно настолько стандартны, насколько это возможно
def create
@question = Question.new(question_params)
if @question.save
render json: { question: @question }, status: :created
else
render json: { errors: @question.errors }, status: :bad_request
end
end
def question_params
params.permit(:content, :type)
end
Комментарии:
1. Обратите внимание, что это
type
имеет особое значение .
Ответ №1:
Каков правильный способ обработки этого, чтобы мой API возвращал код 400 или 422, если тип вопроса не входит в белый список?
Вы бы сделали это в качестве подтверждения. Самый простой способ-сделать это на модели вопроса.
class Question < ApplicationRecord
validates :type, inclusion: { in: %w(OpenEnded StarRating) }
end
Сохранить не удастся, если тип отсутствует или неверен.
Обратите внимание, что тип имеет особое значение, вы можете рассмотреть другое имя столбца, если не используете наследование одной таблицы.
Комментарии:
1. АФАК рубокоп жалуется на %w() => %w[..].
2. @razvans Это прямо из направляющих Рельсов. У рубокопа есть свое мнение. Некоторые из них немного суетливы.
3. Колонка на самом деле не называется
type
, просто ее было легче понять , чемkind
, но спасибо за предупреждение!