Onde os validadores customizados do Rails 3 devem ser armazenados?

93

Já vi documentos / sites mostrarem que os validadores personalizados devem ir para um diretório /libou /lib/validatorsde um projeto. Eu descobri (lendo uma resposta a outra postagem) que eles só parecem funcionar config/initializers. Alguém sabe ou tem uma indicação da documentação oficial que mostra onde os validadores personalizados devem morar?

Daniel D
fonte

Respostas:

220

Se você colocar seus validadores personalizados, app/validatorseles serão carregados automaticamente sem a necessidade de alterar seu config/application.rbarquivo.

gbc
fonte
Não sei se há alguma gema / configuração que você precisa adicionar para isso, mas no rails 3.2.8 isso não funciona. Especificamente, simplesmente soltar seu validador em app / validators / ???. Rb não funciona.
Doug
17
Doug tenta nomear o arquivo do validador da mesma forma que a classe do validador é nomeada, mas sublinhada: MyCoolValidator vai para app / validators / my_cool_validator.rb
equivalente
14
@Doug você precisa reiniciar seu servidor. Os caminhos de carregamento automático são expandidos na inicialização para que novas subpastas não sejam selecionadas até que você faça isso.
Timo
Eu também gosto de monkeypatch ActiveModel :: Validations :: HelperMethods para adicionar um auxiliar para minha nova validação (por exemplo, validates_address para AddressValidator). Quando incluo o monkeypatch e o Validator em app / validators / address_validator.rb, apenas o objeto AddressValidator é carregado, não o monkeypatch. Vocês estão experimentando o mesmo comportamento?
jshkol
1
spring stopfoi necessário para mim no Rails 5.2, caso contrário, não foi detectado.
Jack Kinsella
15

Se você adicionar isso ao seu arquivo /config/application.rb:

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

Então o Rails carregará automaticamente seus validadores na inicialização (assim como / config / initializers /), mas você mantém a estrutura limpa de ter seus validadores em um local bonito e bem nomeado.

gunit888
fonte
9
Boa ideia, mas seu código precisa de uma limpeza: config.autoload_paths += %W(#{config.root}/lib/validators/)
aNoble
6

lib/validatorsparece de longe o mais limpo. No entanto, você pode precisar carregá-los antes de seus modelos, provavelmente de um inicializador.

Jakub Hampl
fonte
4

Aqui estão os documentos oficiais sobre validações personalizadas. AFAIK é uma boa prática mantê-los nos modelos relevantes.

Shreyas
fonte
5
A menos que sejam aplicáveis ​​a vários modelos, nesse caso você deve mantê-los em outro lugar para permanecer SECO.
Andrew Marshall,
Presumivelmente, é o que eles são, porque, do contrário, não há muito sentido em criar uma classe separada para eles.
Jakub Hampl
7
@Jakub Sim, existe: Princípio de Responsabilidade Única
mattwynne
2
O link para os documentos oficiais está quebrado. Aqui está a localização atual dessa documentação; guias.rubyonrails.org/…
Stijnster