Не удается пропустить проверку в Rails 3?

Я работаю над проектом в 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. Такие же сообщения об ошибках при любой попытке сохранения.

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

Спасибо!


person Andrew    schedule 14.01.2011    source источник
comment
Почему бы пользователям не редактировать @model = Model.new вместо создания записи? Затем вы можете проверить их перед сохранением их изменений.   -  person David Sulc    schedule 14.01.2011
comment
В основном потому, что мне нужно иметь возможность сохранять часть информации, которую они вводят, по ходу дела. У меня есть несколько связанных моделей (own_to), которые довольно сложны, и я хочу, чтобы каждую из них можно было сохранять по мере заполнения, что требует идентификатора для родителя. Родительская модель завершена и становится действительной, когда все сделано.   -  person Andrew    schedule 14.01.2011


Ответы (4)


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

validates_presence_of :title, :unless => :in_first_stage?

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

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

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

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

person Leventix    schedule 16.09.2011

*вздох...*

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

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

person Andrew    schedule 14.01.2011

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

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

my_model.save validate: false

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

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

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

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

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

person superluminary    schedule 26.03.2014

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

person Andy Lindeman    schedule 14.01.2011
comment
Было бы неплохо, но я не могу. У меня есть вложения файлов и т. Д., Которые должны быть отправлены как часть модели, и для правильного сохранения в процессе создания они должны уже знать, каким будет идентификатор родительского объекта. - person Andrew; 14.01.2011
comment
Проблема с тем, чтобы сделать это таким образом, заключается в том, что если пользователь уходит и возвращается после очистки своего сеанса, эта запись больше не будет доступна. (Например, при первом входе в систему). - person thekingoftruth; 11.05.2012