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?

Daniel D.
quelle

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 .

gbc
quelle
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.

gunit888
quelle
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.

Jakub Hampl
quelle
4

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

Shreyas
quelle
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