Accéder aux attributs bruts d'un modèle Rails
L’autre jour, j’ai eu besoin d’ajouter un validateur Rails dans le modèle User
de mon projet afin de retourner une erreur spécifique si un utilisateur indique une date invalide (par exemple le 31 février 2020) comme date de naissance.
Mais j’ai rencontré un souci car durant mes tests lorsque j’indique une date invalide je récupère la valeur nil
pour mon champ birthday
dans mon validateur sans que je ne comprenne pourquoi.
J’ai fini par trouver une solution grâce à un commentaire sur GitHub expliquant qu’il s’agit d’un comportement normal de Rails qui met une à date à nil
si il n’arrive pas à parser la valeur reçue.
Le même commentaire indique qu’il est possible d’accéder aux valeurs avant avant qu’elles soient castées par Rails grâce aux méthodes <attribute>_before_type_cast
.
class User < ApplicationRecord
validate :birthday_is_valid
def birthday_is_valid
Date.parse(birthday_before_type_cast)
rescue ArgumentError
errors.add(:birthday, 'date does not exist')
end
end