rails 3路由堆栈级别设计太深

我收到有关我的路线文件的错误

SystemStackError (stack level too deep): actionpack (3.2.8) lib/action_dispatch/middleware/reloader.rb:70 Rendered /Users/duy/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.5ms) Rendered /Users/duy/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.3ms) Rendered /Users/duy/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (19.9ms) 

我可以隔离有问题的代码,但不明白是什么创建了无限循环:

  devise_for :users, :controllers => { :registrations => "registrations", :sessions => "sessions", :omniauth_callbacks => "users/omniauth_callbacks" } devise_scope :user do match '/sessions/simulate_user/:id' => 'sessions#simulate_user', :as => :simulate_user_sessions match '/sessions/leave_simulation_mode' => 'sessions#leave_simulation_mode', :as => :leave_simulation_mode_sessions get "user_confirmation", :to => "devise/confirmations#create" get "after_confirmation", :to => "challenges#index" end 

任何帮助将不胜感激!

编辑:

 class SessionsController < Devise::SessionsController def new @after_sign_in_page = params[:after_sign_in_page] if params[:after_sign_in_page] super end def create params[:user][:email].downcase! super end def simulate_user if can? :simulate_user, User admin = current_user.id sign_out @user = User.find(params[:id]) if sign_in @user session[:simulation_for] = admin redirect_to request.referer else flash[:notice] = "Something went wrong" redirect_to action: "leave_simulation_mode" end end end def leave_simulation_mode @user = User.find(session[:simulation_for]) sign_out if sign_in @user session[:simulation_for] = nil else flash[:notice] = "something went wrong..." end redirect_to request.referer end end class ChallengesController < ApplicationController def index params[:format] = "html" unless params[:subaction].nil? @video = true unless user_signed_in? if current_user @current_page = params[:page] ? params[:page].to_i : 1 @columns = params[:cols] ? params[:cols] : 2 @keyword = params[:keyword] @search = true if params[:search] == "1" @challenges = Challenge.is_open.where(id: current_user.challenges.filtered(params[:keyword],params[:user],params[:expertize]).collect(&:root_id).uniq) logger.debug "Challenges found: #{@challenges.count}" @users = User.scoped @expertizes = Expertize.all end respond_to do |format| format.html { if current_user if current_user.challenges.waiting_for_approval.count == 1 and @challenges.count == 1 redirect_to challenge_path(current_user.challenges.waiting_for_approval.first, subaction: "description") return logger.debug "REdirect called" else @challenges = @challenges.page(1).per(@current_page.to_i * 10).order('children_count+tasks_count desc') end end render } format.json { render json: @challenges } format.js { @challenges = @challenges.page(@current_page).per(10).order('children_count+tasks_count desc') render } end end end 

另外,我忘了提到当我重新启动本地服务器时,它工作正常。 每次我更改routes.rb文件时,都会收到此错误。 然后我必须重新启动Thin服务器,然后我可以继续…

编辑2:

rake route输出: https : //www.dropbox.com/s/knmkk1f54vx47yj/rake%20routes.rtf

我和你有同样的问题。 这必定是一些gem造成的问题。

就像我用“devise_invitable”和“devise”一样。 然后每次我在开发环境中修改路由文件。 它会从“lib / action_dispatch / middleware / reloader.rb”引发“堆栈太深”的错误。

看完你的post后。 我试着评论devise_for:users。 重新加载路线是好的。

然后我尝试从Gemfile中删除“devise_invitable”。

经过改动。 它不会引起错误。 这是在我使用Rails 3.2.9之后发生的。 我有另一个项目

我只是猜测,但你的SessionsController#simulate_userSessionsController#leave_simulation_mode暴露了一个无限的重定向循环。

如果您访问url /simulate_user并且登录无效(否则路径),您将重定向到/leave_simulation_mode 。 现在在leave_simulation_mode ,无论登出/登录是否有效,您都会再次重定向回/simulate_user ,原因是redirect_to request.referer

现在回到/simulate_user ,用户再次登录,再次失败 – >再次重定向。

如果有什么东西阻止你的模拟用户正确登录,你会得到一个无限的重定向循环:

 simulate_user -> leave_simulation_mode -> simulate_user -> leave_simulation_mode --> ... 

希望有所帮助!

将所有monkeypatches移动到initalizers。

由于ActionDispatch :: Request的monkeypatching,我遇到了同样的问题。 补丁被放置到基础控制器。 当我将其替换为初始化程序时,问题已修复。

从其他答案中不清楚,但这是版本1.1.5中修复的devise_invitable gem中的一个错误。 以下是GitHub上的问题: https : //github.com/scambra/devise_invitable/issues/252