2014-09-30 39 views
14

我在我的Rails 4预约调度应用程序中遇到了一些错误,我似乎无法纠正或找出根本原因。这是什么Rails4错误是什么意思?致命:异常重新进入......`在rollback_active_record_state中拯救!'

我的种子文件不断突破,众所周知的“错误,堆栈层面太深”。但是当我运行该方法时,我认为它正在破裂,我得到这个不同的错误:

 
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

你有没有解决这个问题?我收到类似的错误。谢谢 – Udi 2015-01-27 01:36:42

+1

我不知道这是否是你的错误,但是当我有两个相互关联的模型时,我遇到了这个问题,两者都用'dependent::destroy'关系 – glittershark 2015-01-28 21:27:39

+0

谢谢你的回应。问题最终成为我的TimeSlot模型中的递归方法调用。我正在使用:before_save Active Record回调来检查并设置TimeSlot实例的状态属性。更新将递归捕获:before_save回调。当时,我没有把这个方法指出的东西放在一起。它有助于指出这是一个特别的致命错误,它正在保存中,并且在外部调用时存在堆栈级别太深的错误。 – RKelley 2015-07-10 06:36:11

回答

21

所以我只是遇到类似的问题与类似的错误消息。

这只是ActiveRecord是“有益的”,并告诉你,你递归地调用相同的方法。基本上,不是说你跑出堆栈,而是看着它最初得到的踪迹,并确定它实际上是一个重新进入的递归调用。

至少,这解决了我的问题。

+0

这是正确的,我接受了你的答案。递归是在我的TimeSlot模型中。我正在使用:before_save回调递归检查并设置TimeSlot实例的状态属性。 – RKelley 2015-07-10 06:24:33

+0

..更新将递归地捕获before_save条件,并重新进入循环。 – RKelley 2015-07-10 06:37:29

+7

如何找出递归调用哪种方法?这发生在GET请求中没有任何内容时。 – panzi 2016-06-20 17:18:13