Wo sollen benutzerdefinierte Rails 3-Validatoren gespeichert werden?


93

Ich habe gesehen, dass Dokumente / Websites zeigen, dass benutzerdefinierte Validatoren in ein /liboder /lib/validatorsVerzeichnis eines Projekts verschoben werden sollten . Ich habe festgestellt (indem ich eine Antwort auf einen anderen Beitrag gelesen habe), dass sie nur zu funktionieren scheinen config/initializers. Kennt jemand die offizielle Dokumentation oder hat er einen Hinweis darauf, wo benutzerdefinierte Validatoren leben sollten?


Antworten:


220

Wenn Sie Ihre benutzerdefinierten Validatoren einfügen app/validators, werden diese automatisch geladen, ohne dass Sie Ihre config/application.rbDatei ändern müssen .


Ich weiß nicht, ob Sie dafür ein Gem / Config hinzufügen müssen, aber unter Rails 3.2.8 funktioniert dies nicht. Insbesondere funktioniert es nicht, Ihren Validator einfach in app / validators / ???. Rb abzulegen.
Doug

17
Doug versucht, die Validator-Datei so zu benennen, wie die Validator-Klasse benannt, aber unterstrichen ist: MyCoolValidator geht zu app / validators / my_cool_validator.rb
äquivalent8

14
@Doug müssen Sie Ihren Server neu starten. Die Autoload-Pfade werden bei der Initialisierung erweitert, sodass neue Unterordner erst dann abgerufen werden, wenn Sie dies tun.
Timo

Ich möchte auch ActiveModel :: Validations :: HelperMethods monkeypatchen, um einen Helfer für meine neue Validierung hinzuzufügen (z. B. validates_address für AddressValidator). Wenn ich sowohl den Monkeypatch als auch den Validator in app / validators / address_validator.rb einbinde, wird nur das AddressValidator-Objekt geladen, nicht der Monkeypatch. Habt ihr das gleiche Verhalten?
Jshkol

1
spring stopwar für mich in Rails 5.2 notwendig, sonst wurde es nicht abgeholt.
Jack Kinsella

15

Wenn Sie dies zu Ihrer Datei /config/application.rb hinzufügen:

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

Dann lädt Rails Ihre Validatoren beim Start automatisch (genau wie / config / initializers /), aber Sie behalten die saubere Struktur bei, Ihre Validatoren an einem schönen, gut benannten Ort zu haben.


9
Gute Idee, aber Ihr Code muss bereinigt werden: config.autoload_paths += %W(#{config.root}/lib/validators/)
aNoble

6

lib/validatorsscheint bei weitem das sauberste. Möglicherweise müssen Sie sie jedoch vor Ihren Modellen laden, also wahrscheinlich von einem Initialisierer.


4

Hier sind die offiziellen Dokumente zu benutzerdefinierten Validierungen. AFAIK ist eine gute Praxis, um sie in den relevanten Modellen zu halten.


5
Sofern sie nicht für mehrere Modelle gelten, sollten Sie sie an anderer Stelle aufbewahren, um trocken zu bleiben.
Andrew Marshall

Was sie vermutlich sind, weil es sonst wenig Sinn macht, eine separate Klasse für sie zu erstellen.
Jakub Hampl

7
@ Jakub Ja, es gibt: Prinzip der
Einzelverantwortung

2
Der Link zu den offiziellen Dokumenten ist unterbrochen. Hier ist der aktuelle Speicherort dieser Dokumentation. guides.rubyonrails.org/…
Stijnster
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.