2014-09-30 6 views
14

Ho riscontrato un paio di errori nella mia applicazione di pianificazione degli appuntamenti di Rails 4 che non riesco a correggere o capire la causa principale.Che cosa significa questo errore Rails4? fatale: eccezione rientrata ... `rescue in rollback_active_record_state! '

Il file di semi continua a rompersi con il noto "errore, livello di stack troppo profondo". Ma quando ho eseguito il metodo credo che è rottura su, ottengo questo errore diverso:

 
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!' 

I file interessati sono i seguenti.

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 

Passando attraverso la mia storia di impegno, non sono a conoscenza di eventuali modifiche apportate alle generate_time_slots! metodo, e ha funzionato in precedenza. Sto usando Rails 4, Ruby 2.

+1

Hai mai risolto questo? Sto ottenendo un errore simile. Grazie – Udi

+1

Non so se questo è stato il tuo errore in particolare, ma mi sono imbattuto in questo quando avevo due modelli collegati tra loro, entrambi con 'dependent:: destroy' sulla relazione – glittershark

+0

Grazie per la risposta. Il problema si è rivelato essere una chiamata al metodo ricorsiva nel mio modello TimeSlot. Stavo usando un: before_save Callback di Active Record per controllare e impostare l'attributo status di un'istanza di TimeSlot. L'aggiornamento acquisiva in modo ricorsivo il callback before_save. A quel tempo, non ho messo insieme ciò che il metodo indicava. È utile sottolineare che si trattava in particolare di un errore irreversibile, che si stava interrompendo con il salvataggio, e che c'era un errore troppo profondo a livello di stack quando chiamato esternamente. – RKelley

risposta

21

Quindi ho appena avuto un problema simile con un messaggio di errore simile.

È solo che ActiveRecord è "utile" e ti dice che hai chiamato lo stesso metodo in modo ricorsivo. Fondamentalmente, piuttosto che dire che hai esaurito lo stack, stai osservando la traccia originariamente ricevuta e determinarla è in realtà una chiamata ricorsiva rientrata.

Almeno, questo ha risolto il mio problema.

+0

Questo è corretto, ho accettato la tua risposta. La ricorsione era nel mio modello TimeSlot. Stavo usando un: before_save callback per controllare e impostare ricorsivamente l'attributo status di un'istanza di TimeSlot. – RKelley

+0

.. L'aggiornamento catturerebbe in modo ricorsivo la condizione before_save e reinserirà il ciclo. – RKelley

+7

Come posso scoprire quale metodo è chiamato in modo ricorsivo? Questo succede per me quando non c'è nulla salvo in una richiesta GET. – panzi

Problemi correlati