¿Dónde se deben almacenar los validadores personalizados de Rails 3?

93

He visto documentos / sitios web que muestran que los validadores personalizados deben ir en un directorio /libo /lib/validatorsde un proyecto. Descubrí (leyendo una respuesta a otra publicación) que solo parecen funcionar config/initializers. ¿Alguien sabe o tiene un puntero a la documentación oficial que muestra dónde deberían vivir los validadores personalizados?

Daniel D
fuente

Respuestas:

220

Si coloca sus validadores personalizados, app/validatorsse cargarán automáticamente sin necesidad de modificar su config/application.rbarchivo.

gbc
fuente
No sé si hay alguna gema / configuración que deba agregar para esto, pero bajo los rieles 3.2.8 esto no funciona. Específicamente, simplemente colocar su validador en app / validators / ???. Rb no funciona.
Doug
17
Doug intenta nombrar el archivo del validador de la misma manera que se nombra la clase del validador pero se subraya: MyCoolValidator va a app / validators / my_cool_validator.rb
equivalente 8
14
@Doug necesitas reiniciar tu servidor. Las rutas de carga automática se expanden en la inicialización, por lo que no se recogerán nuevas subcarpetas hasta que lo haga.
Timo
También me gusta monopatch ActiveModel :: Validations :: HelperMethods para agregar un ayudante para mi nueva validación (por ejemplo, validates_address para AddressValidator). Cuando incluyo tanto el monkeypatch como el Validator en app / validators / address_validator.rb, solo se carga el objeto AddressValidator, no el monkeypatch. ¿Están experimentando el mismo comportamiento?
jshkol
1
spring stopera necesario para mí en Rails 5.2, de lo contrario, no se recogió.
Jack Kinsella
15

Si agrega esto a su archivo /config/application.rb:

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

Luego, Rails cargará automáticamente sus validadores al iniciar (como / config / initializers /), pero usted mantiene la estructura limpia de tener sus validadores en un lugar agradable y bien nombrado.

gunit888
fuente
9
Buena idea, pero su código necesita un poco de limpieza: config.autoload_paths += %W(#{config.root}/lib/validators/)
aNoble
6

lib/validatorsparece de lejos el más limpio. Sin embargo, es posible que deba cargarlos antes que sus modelos, por lo que probablemente desde un inicializador.

Jakub Hampl
fuente
4

Aquí están los documentos oficiales sobre validaciones personalizadas. AFAIK es una buena práctica mantenerlos en los modelos relevantes.

Shreyas
fuente
5
A menos que sean aplicables a varios modelos, en cuyo caso debe guardarlos en otro lugar para mantenerse SECO.
Andrew Marshall
Que es lo que presumiblemente son porque, de lo contrario, no tiene mucho sentido crear una clase separada para ellos.
Jakub Hampl
7
@Jakub Sí, existe: Principio de responsabilidad única
mattwynne
2
El enlace a los documentos oficiales está roto. Aquí está la ubicación actual de esa documentación; guides.rubyonrails.org/…
Stijnster