Подтвердить что ты не робот

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

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

Спасибо!

4b9b3361

Ответ 1

* Вздох... *

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

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

Ответ 2

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

validates_presence_of :title, :unless => :in_first_stage?

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

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

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

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

Ответ 3

Только для чрезвычайных ситуаций

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

my_model.save validate: false

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

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

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

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

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

Ответ 4

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