Что означает эта ошибка Rails4? fatal: исключение повторно введено... `rescue in rollback_active_record_state! '

Я получаю пару ошибок в приложении планирования расписания Rails 4, которое, похоже, не может исправить или выяснить причину.

Мой файл семян продолжает ломаться с известной "ошибкой, уровень стека слишком глубокий". Но когда я запускаю метод, я считаю, что он ломается, я получаю эту другую ошибку:

Seeding time slots for workday no. 1
   (0.5ms)  SAVEPOINT active_record_1
   (0.5ms)  ROLLBACK TO SAVEPOINT active_record_1
fatal: exception reentered
from /Users/rskelley/.rvm/gems/ruby-2.0.0-p481/gems/activerecord-4.1.5/lib/active_record/transactions.rb:286:in `rescue in rollback_active_record_state!'

Связанные файлы следующие.

Seeds.rb

puts "Seeding Workdays."

day_numbers = (1..5).to_a
5.times do
  start_time = WorkDay.time_slot_format(9)
  end_time = WorkDay.time_slot_format([5,6][rand(2)])
  rand_date = Date.today + day_numbers.slice!(0)
  WorkDay.create(start_time: start_time, end_time: end_time, date: rand_date )
end

puts "Generating Time Slots for each WorkDay"

workdays = WorkDay.all
workday_number = 1

workdays.each do |workday|
  calendar_manager = CalendarManager.new(workday: workday, date: workday.date)
  puts "Seeding time slots for workday no. #{workday_number}"
  workday_number += 1
  calendar_manager.generate_time_slots!
end

calendar_manager.rb

include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
extend AppointmentTools

attr_accessor :workday, :date, :slot_length

 def generate_time_slots!(increment=15)
    # Space between start and end
    @slot_length ||= increment

    day = self.workday.date
    hour = 9
    minute = 0
    @time_slots = Array.new

    33.times do
      beginning = TimeOfDay.parse(hour) + minute.minutes
      ending = beginning + @slot_length.minutes
      time_slot = TimeSlot.create work_day_id: self.workday.id, start_time: beginning.strftime("%I:%M %p"), end_time: ending.strftime("%I:%M %p"), date: day
      @time_slots << time_slot
      minute += @slot_length
    end
  end

Просматривая мою историю фиксации, я не знаю никаких изменений, внесенных в generate_time_slots! метод, и он работал ранее. Я использую Rails 4, Ruby 2.

Ответы

Ответ 1

Итак, у меня была аналогичная проблема с похожим сообщением об ошибке.

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

По крайней мере, это решило мою проблему.