После некоторых поисков я не смог найти однострочник в модели, чтобы это произошло.К настоящему моменту Rails предоставляет Enums, но не исчерпывающий способ проверки недопустимых значений.
Итак, я выбрал составное решение: добавить проверку в контроллере, перед установкой strong_params
, а затемпроверка по модели.
Итак, в модели я создам атрибут и пользовательскую проверку:
Particip.rb
enum :status => { your set of values }
attr_accessor :invalid_status
validate :valid_status
#...
private
def valid_status
if self.invalid_status == true
errors.add(:status, "is not valid")
end
end
Кроме того, я проверю параметры на недопустимый ввод и отправлю результат (при необходимости) в модель, поэтому к объекту будет добавлена ошибка, что сделает его недействительным
Participnds_controller.rb
private
def attend_params
#modify strong_params to include the additional check
if params[:attend][:status].in?(Attend.statuses.keys << nil) # to also allow nil input
# Leave this as it was before the check
params.require(:attend).permit(....)
else
params[:attend][:invalid_status] = true
# remove the 'status' attribute to avoid the exception and
# inject the attribute to the params to force invalid instance
params.require(:attend).permit(...., :invalid_status)
end
end