Не можете пропустить проверку в Rails 3? - PullRequest
20 голосов
/ 14 января 2011

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

Теперь я столкнулся с довольно простой проблемой: я не могу сохранить модель, не проверяя ее ни при каких обстоятельствах.

Я пыталсяв консоли:

model = Model.new
model.save(false) # Returns RuntimeError: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
model.save( :validate => false ) # Returns same error as above

model = Model.create
model.save(false) # Same runtime error
model.save( :validate => false ) # Same runtime error

Затем я попытался изменить все проверки в модели на :on => :update.Одинаковые сообщения об ошибках при любой попытке сохранения.

Так чего мне здесь не хватает?Как я могу создать пустую запись, а затем разрешить проверку, когда пользователь ее редактирует?

Спасибо!

Ответы [ 4 ]

23 голосов
/ 16 сентября 2011

Неправильно сохранять недопустимые модели при нормальном использовании. Вместо этого используйте условные проверки:

validates_presence_of :title, :unless => :in_first_stage?

или если у вас их много:

with_options :unless => :in_first_stage? do
  validates_presence_of :title
  validates_presence_of :author
end

Таким образом, ничто не мешает проводить ночные тесты на целостность, которые проверяют все записи на достоверность.

Действительный вариант использования для сохранения без проверок был бы для тестирования крайних вариантов, например, чтобы проверить, что ограничение базы данных применено.

14 голосов
/ 14 января 2011

* Вздох ... *

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

Спасибо всем.

3 голосов
/ 26 марта 2014

Только для экстренных случаев

Предполагая, что вы очень тщательно это рассмотрели и уверены, что это хорошая идея, вы можете сохранить без проверки, используя:

my_model.save validate: false

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

Проблемы с недействительными записями

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

Условная проверка

Как указывали другие авторы, условная проверка решит большинство проблем, по которым у вас могут возникнуть другие проблемыиспользуется валидат: ложь.

1 голос
/ 14 января 2011

Вместо размещения недопустимой модели в базе данных сохраните частично завершенную модель (созданную с помощью Model.new) в сеансе .Сохраняйте его в базе данных только тогда, когда он полностью действителен.

...