Рельсы, разрешающие только определенные строки в качестве параметра

#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 , но спасибо за предупреждение!