Rails before_validaion и перед сохранением вызывают StackError - PullRequest
0 голосов
/ 04 мая 2020

Я работаю над обновлением приложения Rails с 4.2 -> 5.2 (Ruby 2.3)

И после обновления я получил SystemStackError: слишком большой уровень стека в моем модульном тесте

У меня есть модальный Рекомендация

class Recommendation < ApplicationRecord
  has_many :approval_chains

  def modify!(person)
    approval_actions.create(person: person,
                              state: ApprovalState.MODIFY,
                              created_by: person)
  end
end

class ApprovalAction < ApplicationRecord
  belongs_to :recommendation

  validates_presence_of :approver, if: -> { approver_required? }
  before_save :setup_validation
  before_validation :update_approver, if: -> { approver_missing? && uses_approval_workflow? }
  before_save :fill_in_note

  def update_approver
    if recommendation.present? && recommendation.active_approval_chain.present?
      matching_person = recommendation.active_approval_chain.approvers.find_by(approver_id: created_by_person_id)
      self.approver = matching_person
    end
  end

  def fill_in_note
    self.workflow_note ||= WorkflowNote.create
    self.workflow_note.update_attributes(person: person, recommendation: recommendation)
  end

  def approver_required?
    person.nil?
  end
end

Итак, в модульном тесте я попытался вызвать модификатор! (Человек) в модели Рекомендации.

r = Recommendation.create(attributes)
person = Person.create(person_attributes)
r.modify!(person)

Тогда я получил SystemStackError. Похоже, он падает в бесконечное число l oop в update_approver и fill_in_note.

Кто-нибудь может помочь? Это не происходит в Rails 4.2

Другое изменение, которое я сделал: раньше я использовал validates_presence_of :approver, if: 'approver_required?' вместо if: -> {approver_required?}, изменив его на lambda, так как Rails 5.2 не поддерживает String в if: и unless:

...