Вы можете просто сохранить данные в том виде, как они есть (в контроллере), и иметь другое поле в модели, говорящее ему, как интерпретировать данные. Затем, в обратном вызове before_validation, вы можете попытаться проанализировать дату в соответствии с заданным форматом и записать ее в то же поле, теперь как дату. Проблемы могут возникнуть на обратном пути. Затем, чтобы снова отобразить его в представлении, вы можете написать помощники - но еще лучше - предоставить в модели метод (например, formatted_date), который будет вычислять и отображать дату.
Однако это требование звучит странно. Почему пользователь несет ответственность за выбор формата даты? Разве это не должно основываться на локали пользователя?
В любом случае я предлагаю вам зарегистрировать форматы даты в инициализаторе, а не повторять строки форматирования во всем приложении.