Ruby on rails 升级到rails 3.2.0后堆栈级别太深

Ruby on rails 升级到rails 3.2.0后堆栈级别太深,ruby-on-rails,model,ruby-on-rails-3.2,Ruby On Rails,Model,Ruby On Rails 3.2,我正在将我的应用程序升级到最新的rails,并且遇到了堆栈级别太深的错误。当我从模型中发出ajax请求时,就会发生此错误。以下是错误和相关控制器/型号代码: 错误 [679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1] Processing by CoachesController#new as */* [679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1] Parameters: {"date"=>"2013

我正在将我的应用程序升级到最新的rails,并且遇到了堆栈级别太深的错误。当我从模型中发出ajax请求时,就会发生此错误。以下是错误和相关控制器/型号代码:

错误

[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1] Processing by CoachesController#new as */*
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1]   Parameters: {"date"=>"2013-06-11", "athlete_id"=>"2"}
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1]   User Load (24.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1]   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1]    (0.2ms)  SELECT COUNT(*) FROM "log_entries" WHERE "log_entries"."athlete_id" = 2 AND (date == '2013-06-11')
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1] Completed 500 Internal Server Error in 60ms
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1] 
SystemStackError (stack level too deep):
  actionpack (3.2.0) lib/action_dispatch/middleware/reloader.rb:70
   def new
@athlete = User.find_by_id(params[:athlete_id])   #this is different in normal controller(non coach)
@date = Date.parse(params[:date])
if LogEntry.cal_entry(@date, @athlete.id).size == 0 #check to see if entry exists
  @log_entry = @athlete.log_entries.build
  @log_entry1 = @log_entry.clone
  @workouts = @log_entry.workouts.build
  planned_workouts = @workouts.planned_workouts.build
  n = 1
  1.times do #do not generate more than the zone 1 
    planned_workouts.planned_workout_times.build(:zone => n)
    n += 2
  end
  completed_workouts = @workouts.completed_workouts.build
  n = 1
  1.times do
    completed_workouts.workout_times.build(:zone => n)
    n += 2
  end

else                                                #use already existing LogEntry
  @log_entry1 = LogEntry.cal_entry(@date, @athlete.id).first
  @log_entry = @athlete.log_entries.build
  @log_entry = @log_entry1.clone
  @workouts = @log_entry1.workouts.build
  planned_workouts = @workouts.planned_workouts.build
  n = 1 
  1.times do
    planned_workouts.planned_workout_times.build(:zone => n)
    n += 2
  end
  completed_workouts = @workouts.completed_workouts.build
  n = 1
  1.times do
    completed_workouts.workout_times.build(:zone => n)
    n += 2
  end 
end
控制器

[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1] Processing by CoachesController#new as */*
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1]   Parameters: {"date"=>"2013-06-11", "athlete_id"=>"2"}
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1]   User Load (24.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1]   User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1]    (0.2ms)  SELECT COUNT(*) FROM "log_entries" WHERE "log_entries"."athlete_id" = 2 AND (date == '2013-06-11')
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1] Completed 500 Internal Server Error in 60ms
[679c54ab63bbaad55d7a1bd1fd9246d7] [127.0.0.1] 
SystemStackError (stack level too deep):
  actionpack (3.2.0) lib/action_dispatch/middleware/reloader.rb:70
   def new
@athlete = User.find_by_id(params[:athlete_id])   #this is different in normal controller(non coach)
@date = Date.parse(params[:date])
if LogEntry.cal_entry(@date, @athlete.id).size == 0 #check to see if entry exists
  @log_entry = @athlete.log_entries.build
  @log_entry1 = @log_entry.clone
  @workouts = @log_entry.workouts.build
  planned_workouts = @workouts.planned_workouts.build
  n = 1
  1.times do #do not generate more than the zone 1 
    planned_workouts.planned_workout_times.build(:zone => n)
    n += 2
  end
  completed_workouts = @workouts.completed_workouts.build
  n = 1
  1.times do
    completed_workouts.workout_times.build(:zone => n)
    n += 2
  end

else                                                #use already existing LogEntry
  @log_entry1 = LogEntry.cal_entry(@date, @athlete.id).first
  @log_entry = @athlete.log_entries.build
  @log_entry = @log_entry1.clone
  @workouts = @log_entry1.workouts.build
  planned_workouts = @workouts.planned_workouts.build
  n = 1 
  1.times do
    planned_workouts.planned_workout_times.build(:zone => n)
    n += 2
  end
  completed_workouts = @workouts.completed_workouts.build
  n = 1
  1.times do
    completed_workouts.workout_times.build(:zone => n)
    n += 2
  end 
end
^^这就是调用.cal_entry model函数时出现错误的地方

型号

  scope :log_entry_for_date, lambda { |date1| where('date == ?', date1)}
  scope :log_entry_for_athlete, lambda { |athlete_id| where(:athlete_id => athlete_id)}

  def self.cal_entry(date, athlete_id)
    log_entry_for_date(date).log_entry_for_athlete(athlete_id).includes({:workouts => {:completed_workouts => :workout_times}})
  end
现在,这在rails 3.0中工作得非常好,但升级后会立即显示错误。我尝试升级到rails 3.2,但错误仍然存在

ruby 1.9.3p429

rails 3.2.0


谢谢你的帮助

该错误似乎是由训练模型中名为“method”(用于说明)的方法名称不正确引起的。我想在升级之前这不是问题。

LogEntry.cal\u entry(@date,@atternate.id)。size
实际上正在执行,根据正在吐出的sql。你能包括整个控制器方法吗?刚刚添加了整个方法。通过删除代码行,它看起来像是
@workouts=@log\u entry.workouts.build
,这是创建堆栈级别太深的错误,我的模型是有组织的,因此每个log\u条目都有许多训练,为什么会出现问题?请注意,
find\u by\u id
find
是相同的,而
\u by\u id
是隐含的<代码>用户。按用户id查找(参数[:运动员id])应为
User.find(参数[:运动员id])
。另外,我不知道为什么要使用
n
1.times
n+=2
。这些行对代码没有影响。你的方法应该是这样的:谢谢!这么干净。我最初进行迭代是因为我生成了两个时间域,但后来决定现在只显示一个,从而使代码变得毫无意义。谢谢,我还在学习更干净的代码!