9
votes

Rails: assurer la capitalisation dans le modèle?

Dans un modèle de rails, si j'ai un champ qui correspond à des noms appropriés, quelle est la meilleure pratique de la pratique de s'assurer qu'elles sont uniformément capitalisées malgré une entrée potentiellement paresseuse des utilisateurs?

Disons que le modèle est Contact et le champ est nom . Peu importe ce que l'utilisateur saisit les entrées que je veux que les mots soient capitalisés, c'est-à-dire que le modèle transmettrait l'entrée suivante à la sortie suivante: xxx

donc, créez-vous un avant_save Callback et Tranform Le champ avec une regex ou créez-vous une sorte de validation, ou quelque chose de différent? J'apprécie beaucoup les réponses en mettant l'accent sur la raison d'être, de pourquoi vous le feriez d'une manière ou d'une autre, car c'est ce que je suis le plus coincé.


0 commentaires

4 Réponses :


4
votes

Je suggérerais d'utiliser avant_save.

Comme dans vous modèle: xxx


0 commentaires

3
votes

La question la plus importante est comment allez-vous afficher les noms? Si ce sera sur le Web, comme je devrais deviner, je ne traiterais pas cela dans le modèle du tout. La solution la plus simple consiste simplement à utiliser CSS Text-Tansform: Capitalize; Code> Pour gérer la capitalisation, mais si vous y afficherez, vous voudrez souvent définir une méthode de décorateur ou d'assistance pour la normaliser pour vous. .

def full_name
  [first_name, last_name].map { |name| name[0].upcase + name[1..-1] }.join(' ')
end


0 commentaires

18
votes

La méthode que vous voulez est Titreize . La méthode capitaliser ne fait que le premier caractère de la chaîne entière, donc "John Doe" .Capitaliser # => "John Doe" , "John Doe" .Titer # => "John Doe" .

Quant à la manière de la mettre en œuvre, vous pouvez aller avec un avant_save , mais j'aime faire ce type de préparations simples d'attributs simples avec pseudo-attributs. Fondamentalement, vous définissez une méthode écrivain pour un attribut qui masquera l'une par défaut créée par activerecord . Vous serez toujours en mesure d'accéder à l'attribut à l'aide de la méthode wreck_attribute ( docs ). Ce faisant de cette façon, vous garantira que l'attribut est correctement défini dès que vous l'attribuez , ce qui signifie que même avant de l'enregistrer, vous pouvez être sûr que votre objet est dans un état valide: xxx


2 commentaires

Je l'aime! Je n'étais pas familier avec wreck_attribute mais, wow, quelle technique utile! Cela résout le problème parfaitement trois lignes de code et toutes les spécifications sont passées au premier essai. Une petite chose, dans votre exemple de code auto n'est pas requis, je l'ai réparé pour vous.


@Andrew oh, à droite. J'ai oublié que wreck_attribute est privé . C'est bizarre que sa méthode sœur lisez_attribute est public cependant. Quoi qu'il en soit, content que vous ayez aimé le conseil. Joyeux codage!



8
votes

Une interprétation plus propre de @ TSERIF est ce qui suit: xxx

ceci supprime la dépendance sur write_attribute et la nécessité de spécifier le nom de l'attribut Nom < / code> en faveur d'une méthode plus primitive. Je ne vois pas le besoin de to_s , à moins que vous souhaitiez la possibilité d'attribuer un symbole.


2 commentaires

DEF NAME = (S) Super S & .Titleize fin


.to_s protège contre les nuls. par exemple. IRB (MAIN): 123: 0> NUL.TITLEIZE NOMETHODERORROR: Méthode non définie "Titre" pour NIL: Nilclass