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 donc, créez-vous un Contact code> et le champ est
nom code>. 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: p>
avant_save code> 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 em> vous le feriez d'une manière ou d'une autre, car c'est ce que je suis le plus coincé. P> P>
4 Réponses :
Je suggérerais d'utiliser avant_save.
Comme dans vous modèle: p>
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
La méthode que vous voulez est Quant à la manière de la mettre en œuvre, vous pouvez aller avec un Titreize code>. La méthode
capitaliser code> ne fait que le premier caractère de la chaîne entière, donc
"John Doe" .Capitaliser # => "John Doe" Code>,
"John Doe" .Titer # => "John Doe" code>.
avant_save code>, mais j'aime faire ce type de préparations simples d'attributs simples avec pseudo-attributs. Fondamentalement, vous définissez une méthode
écrivain code> pour un attribut qui masquera l'une par défaut créée par
activerecord code>. Vous serez toujours en mesure d'accéder à l'attribut à l'aide de la méthode
wreck_attribute code> (
Je l'aime! Je n'étais pas familier avec wreck_attribute code> 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 code> n'est pas requis, je l'ai réparé pour vous.
@Andrew oh, à droite. J'ai oublié que wreck_attribute code> est
privé code>. C'est bizarre que sa méthode sœur
lisez_attribute code> est public cependant. Quoi qu'il en soit, content que vous ayez aimé le conseil. Joyeux codage!
Une interprétation plus propre de @ TSERIF est ce qui suit: ceci supprime la dépendance sur write_attribute code> 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 code>, à moins que vous souhaitiez la possibilité d'attribuer un symbole. P> p>
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 Code>