Después de algunos mirando, no pude encontrar una sola línea en el modelo para ayudar a que esto suceda. Por ahora, Rails proporciona Enumeraciones, pero no una forma integral de validar valores no válidos.
Por lo tanto, opté por una solución compuesta: para agregar una validación en el controlador, antes de configurar el strong_params
, y luego al comparar con el modelo.
Así, en el modelo, voy a crear un atributo y una validación personalizada:
asistir.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
Además, voy a hacer una verificación contra los parámetros de entrada no válida y enviar el resultado (si es necesario) para el modelo, por lo que se añadirá un error al objeto, por lo que es válido
attends_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
mu y respuestas de Mike son buenos - véase también http://stackoverflow.com/q/265725/887124, lo que da algunas respuestas ligeramente diferentes a una pregunta similar. –
Sí, en realidad uso algo más similar a la solución que proporcionó Bob: [gist] (https://gist.github.com/1372650) – mnelson