Où les validateurs personnalisés de Rails 3 doivent-ils être stockés?


93

J'ai vu des documents / sites Web montrer que les validateurs personnalisés devraient aller dans un répertoire /libou /lib/validatorsd'un projet. J'ai trouvé (en lisant une réponse à un autre article) qu'ils semblent seulement fonctionner config/initializers. Est-ce que quelqu'un sait ou a un pointeur vers la documentation officielle qui montre où les validateurs personnalisés devraient vivre?


Réponses:


220

Si vous placez vos validateurs personnalisés, app/validatorsils seront automatiquement chargés sans avoir besoin de modifier votre config/application.rbfichier.


Je ne sais pas s'il y a un gem / config que vous devez ajouter pour cela, mais sous les rails 3.2.8 cela ne fonctionne pas. Plus précisément, déposer simplement votre validateur dans app / validators / ???. Rb ne fonctionne pas.
Doug

17
Doug essaie de nommer le fichier de validation de la même manière que la classe de validation est nommée mais soulignée: MyCoolValidator va à app / validators / my_cool_validator.rb
équivalent 8

14
@Doug vous devez redémarrer votre serveur. Les chemins de chargement automatique sont développés lors de l'initialisation, de sorte que les nouveaux sous-dossiers ne seront pas récupérés tant que vous ne le faites pas.
Timo

J'aime aussi monkeypatch ActiveModel :: Validations :: HelperMethods pour ajouter un assistant pour ma nouvelle validation (par exemple, validates_address pour AddressValidator). Lorsque j'inclus à la fois le monkeypatch et le validateur dans app / validators / address_validator.rb, seul l'objet AddressValidator est chargé, pas le monkeypatch. Avez-vous le même comportement les gars?
jshkol

1
spring stopétait nécessaire pour moi dans Rails 5.2, sinon il n'a pas été repris.
Jack Kinsella

15

Si vous ajoutez ceci à votre fichier /config/application.rb:

config.autoload_paths += %W["#{config.root}/lib/validators/"]

Ensuite, Rails chargera automatiquement vos validateurs au démarrage (tout comme / config / initializers /), mais vous gardez la structure propre d'avoir vos validateurs dans un endroit agréable et bien nommé.


9
Bonne idée mais votre code a besoin d'être nettoyé: config.autoload_paths += %W(#{config.root}/lib/validators/)
aNoble

6

lib/validatorssemble de loin le plus propre. Cependant, vous devrez peut-être les charger avant vos modèles, donc probablement à partir d'un initialiseur.


4

Voici la documentation officielle sur les validations personnalisées. AFAIK est une bonne pratique pour les garder dans les modèles pertinents.


5
À moins qu'ils ne s'appliquent à plusieurs modèles, auquel cas vous devriez les garder ailleurs pour rester SEC.
Andrew Marshall

C'est ce qu'ils sont vraisemblablement, car sinon, il ne sert à rien de créer une classe distincte pour eux.
Jakub Hampl

7
@Jakub Oui, il y a: Principe de responsabilité unique
mattwynne

2
Le lien vers les documents officiels est rompu. Voici l'emplacement actuel de cette documentation; guides.rubyonrails.org
Stijnster
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.