Рельсы 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
Любая помощь будет принята с благодарностью!
EDIT:
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, я получаю эту ошибку. Затем я должен перезапустить тонкий сервер, затем я могу продолжить работу...
ИЗМЕНИТЬ 2:
вывод рейка: https://www.dropbox.com/s/knmkk1f54vx47yj/rake%20routes.rtf
Ответы
Ответ 1
У меня с вами такая же проблема. Это должно быть проблемой, вызванной некоторыми драгоценными камнями.
Как я использую "devise_invitable" с "devise". затем каждый раз, когда я изменяю файл маршрута в среде разработки. он приведет к возникновению "слишком глубокой" ошибки из "lib/action_dispatch/middleware/reloader.rb".
После прочтения вашего сообщения. Я пытаюсь прокомментировать devise_for: users.
Перезагрузка маршрутов в порядке.
Затем я пытаюсь удалить "devise_invitable" из Gemfile.
После внесенных изменений. это не вызывает ошибки.
Это случилось после использования Rails 3.2.9.
У меня есть другой проект < Rails 3.2.9, два драгоценных камня работают правильно.
Ответ 2
Я только догадываюсь, но ваша конструкция 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 --> ...
Надеюсь, что это поможет!
Ответ 3
Переместите все обезьяньи палитры в инициализаторы.
У меня такая же проблема из-за monkeypatching ActionDispatch:: Request. Патч был помещен в базовый контроллер. Когда я заменил его на инициализаторы, проблема была исправлена.
Ответ 4
Это не ясно из других ответов, но это была ошибка в devise_invitable gem, которая была исправлена в версии 1.1.5. Здесь проблема GitHub: https://github.com/scambra/devise_invitable/issues/252