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?

Daniel D
la source

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.

gbc
la source
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é.

gunit888
la source
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.

Jakub Hampl
la source
4

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

Shreyas
la source
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