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.