Где следует хранить пользовательские валидаторы Rails 3?

94

Я видел документы / сайты показывают , что пользовательские валидаторы должны идти в /libили /lib/validatorsдиректории проекта. Я обнаружил (читая ответ на другой пост), что они, похоже, только работают config/initializers. Кто-нибудь знает или имеет указатель на официальную документацию, которая показывает, где должны жить пользовательские валидаторы?

Дэниел Д.
источник

Ответы:

221

Если вы разместите свои собственные валидаторы, app/validatorsони будут автоматически загружены без необходимости изменять ваш config/application.rbфайл.

gbc
источник
Я не знаю, нужно ли для этого добавить какой-нибудь гем / конфигурацию, но под rails 3.2.8 это не работает. В частности, простое размещение валидатора в app / validators / ???. Rb не работает.
Дуг
17
Дуг пытается назвать файл валидатора так же, как назван класс валидатора, но с подчеркиванием: MyCoolValidator переходит в app / validators / my_cool_validator.rb
аналогично8
14
@Doug вам нужно перезагрузить сервер. Пути автозагрузки расширяются при инициализации, поэтому новые подпапки не будут загружены, пока вы этого не сделаете.
Timo
Мне также нравится monkeypatch ActiveModel :: Validations :: HelperMethods, чтобы добавить помощника для моей новой проверки (например, validates_address для AddressValidator). Когда я включаю и monkeypatch, и Validator в app / validators / address_validator.rb, загружается только объект AddressValidator, а не monkeypatch. Вы, ребята, испытываете такое же поведение?
jshkol
1
spring stopмне нужно было в Rails 5.2, иначе не подхватили.
Джек Кинселла
15

Если вы добавите это в свой файл /config/application.rb:

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

Затем Rails автоматически загрузит ваши валидаторы при запуске (точно так же, как / config / initializers /), но вы сохраните чистую структуру, когда ваши валидаторы будут находиться в одном красивом, хорошо названном месте.

Gunit888
источник
9
Хорошая идея, но ваш код нуждается в некоторой очистке: config.autoload_paths += %W(#{config.root}/lib/validators/)
aNoble
6

lib/validatorsкажется, безусловно, самым чистым. Однако вам может потребоваться загрузить их до ваших моделей, возможно, из инициализатора.

Якуб Хампл
источник
4

Вот официальные документы о пользовательских проверках. AFAIK это хорошая практика, чтобы держать их в соответствующих моделях.

Шреяс
источник
5
Если они не применимы к нескольким моделям, в этом случае вы должны хранить их в другом месте, чтобы они оставались СУХИМИ.
Эндрю Маршалл
Предположительно, они и есть, потому что иначе нет смысла создавать для них отдельный класс.
Якуб Хэмпл,
7
@Jakub Да, есть: Принцип единой ответственности
Мэттвинн,
2
Ссылка на официальную документацию не работает. Вот текущее местонахождение этой документации; guides.rubyonrails.org/…
Stijnster