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_user
和SessionsController#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