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?


Respostas:


220

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


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.


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.


4

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.