Я работаю над обновлением приложения 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: