1 min read

Accéder aux attributs bruts d'un modèle Rails

Parfois on veut accéder aux valeurs passées un modèle Rails sans qu'elles ne soient passées par le framework. C'est possible grâce à cette petite astuce.

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

Liens

ActiveRecord::Base
Active Record Active Record objects don’t specify their attributes directly, but rather infer them from the table definition with which they’re linked.
How to show an invalid date format message? · Issue #29272 · rails/rails
Steps to reproduce All I am really looking for is showing an invalid date format message from the model... Somehow. ActiveRecord::Schema.define(version: 20170529162250) do create_table &quot;group_...