я делаю что-то неправильно re: Rails with_lock?

#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 и действительно обнаружил давнюю ошибку с атрибутом, у которого произошел сбой проверки.