J'aimerais que mon modèle utilisateur nettoie certaines entrées avant de les enregistrer. Pour l'instant, une simple suppression de l'espace blanc suffit. Ainsi, pour éviter que des personnes s'enregistrent avec "Harry" et prétendent être "Harry", par exemple.
Je suppose que c'est une bonne idée de faire ce dépouillement avant la validation, afin que le validates_uniqueness_of puisse éviter les doublons accidentels.
class User < ActiveRecord::Base
has_many :open_ids
validates_presence_of :name
validates_presence_of :email
validates_uniqueness_of :name
validates_uniqueness_of :email
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
before_validation :strip_whitespace, :only => [:name, :email, :nick]
private
def strip_whitespace(value)
value.responds_to?('strip') ? value.strip : value
end
end
Cependant, ce code est accompagné d'une erreur ArgumentError : wrong number of arguments (0 pour 1). Je supposais que les valeurs seraient transmises à la callback.
Par ailleurs, ce décapage est-il vraiment une bonne idée ? Ou devrais-je plutôt valider sur l'espace et dire à l'utilisateur que "Harry " contient des espaces invalides (je veux autoriser "Harry Potter" mais pas "Harry") ? \s\sPotter ").
Edit : Comme indiqué dans un commentaire, mon code est incorrect (c'est pourquoi je posais la question a.o.). Veuillez vous assurer que vous lisez la réponse acceptée en plus de ma question pour le code correct et pour éviter les mêmes erreurs que j'ai faites.
5 votes
Pour les autres qui tomberaient sur ce sujet, before_validation n'a pas d'objet de type
:only
option. Et le callback ne prend pas d'argument. Voir les réponses pour plus de détails.