Получите проверки модели Rails
-
05-07-2019 - |
Вопрос
Учитывая модель, которая имеет проверки в файле model_name.rb, как я могу получить доступ к этим проверкам вручную?Я хотел бы создать свою собственную систему проверки форм, которая бы работала вместе со встроенными приемами Rails, и я хочу, чтобы все было максимально СУХИМ.Моя основная проблема заключается в том, что мне нужно выполнить проверку на стороне сервера, прежде чем какое-либо значение формы попадет в базу данных (я использую многошаговую форму).
В принципе мне интересно, есть ли такой метод, как
User.validations.each do |v|
puts v.constraint.to_s + " " + v.message
end
Есть ли что-нибудь подобное?
Заранее спасибо.
Решение
Моя основная проблема заключается в том, что мне нужно сделать проверки на стороне сервера, прежде чем любое из значений формы достигнет базы данных (я использую многоэтапную форму).
Если ваша модель недействительна в соответствии с проверками в ее файле класса, ее данные не будут сохранены в базе данных (если вы не передадите false
к save
метод подавления проверок).
- Вы можете в любой момент спросить модель, действительна ли она, вызвав ее
valid?
/invalid?
методы.
Другие советы
Объект ActiveRecord предоставляет метод ошибок после допустимого? называется, который дает вам сообщения о том, какие проверки нарушены. Вы можете проверить действительный? и затем проверьте, являются ли какие-либо поля в части формы, на которой вы находитесь, недействительными. Вы можете сделать что-то подобное для формы с полями field1 и field2.
unless x.valid?
[:field1,:field2].each do |field|
yes_there_was_an_error if x.errors[field]
end
end
Лучше всего использовать конечный автомат и сохранять данные в базе данных между различными этапами формы.
Вы можете сделать, например, validates_presence_of: имя пользователя,: if = > proc {| u | u.signup_step > = 2}
, где signup_step
- это целочисленный столбец в базе данных.
Итак, даже если вы говорите, что не хотите хранить его в базе данных между формами, я думаю, вам следует. Если вы сделаете это, вы можете использовать обычные проверки и модели, без неприятных хаков. И, честно говоря, я сомневаюсь, что сделать это таким образом, является проблемой.