#ruby-on-rails #locking
#ruby-on-rails #блокировка
Вопрос:
Для версий Rails с 4.2 по 5.1.7 приведенный ниже код работал нормально.
В Rails 5.2, в моих тестах Rspec, если я не добавлю дополнительный reload
(показанный ниже в качестве комментария), он завершается ошибкой с исключением:
ActionView::Template::Error:
Locking a record with unpersisted changes is not supported.
Use `save` to persist the changes, or `reload` to discard them explicitly.
Поскольку вызов непосредственно перед with_lock является a save
(согласно сообщению об исключении), почему это все равно вызовет исключение, если reload
сразу после добавлено дополнительное save
?
# merge into the serialized hash field 'settings' a new hash
def update_settings(hash)
return if hash.class != Hash
return if !hash || (hash.count == 0)
self.save # flush any pending changes
# self.reload # <<<<< WHY MUST THIS BE added for rails 5.2?
self.with_lock do
mysettings = self.reload.settings
# mysettings = self.settings
hash.each do |k, v|
mysettings[k] = v
end
self.update_attribute :settings, mysettings
end
end
Ответ №1:
Я предполагаю self.save
, что это сбой. Вы должны напечатать puts self.errors.full_messages
после вашего вызова self.save
, чтобы понять, почему. Или вы могли бы заменить save
на save!
.
Комментарии:
1. превосходная идея, я попробую это
2. да, спасибо, измените его на save! затем просмотрел исключения в rspec и действительно обнаружил давнюю ошибку с атрибутом, у которого произошел сбой проверки.