11

ルートファイルについてこのエラーが発生します

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 ファイルを変更するたびに、このエラーが発生します。次に、シンサーバーを再起動する必要があります。その後、さらに作業を進めることができます...

編集2:

rake ルート出力: https://www.dropbox.com/s/knmkk1f54vx47yj/rake%20routes.rtf

4

4 に答える 4

5

私はあなたと同じ問題を抱えています。これは、いくつかの gem によって引き起こされた問題に違いありません。

「devise」で「devise_invitable」を使用するように。その後、開発環境でルートファイルを変更するたびに. 「lib/action_dispatch/middleware/reloader.rb」から「スタックが深すぎる」​​というエラーが発生します。

あなたの投稿を読んだ後。私はdevise_for :usersにコメントしようとしています。ルートのリロードは問題ありません。

次に、Gemfile から「devise_invitable」を削除しようとします。

変更後。エラーは発生しません。これは、Rails 3.2.9 を使用した後に発生しました。私は別のプロジェクト < Rails 3.2.9 を持っています。2 つの gem が正しく動作します。

于 2013-01-11T07:28:25.060 に答える
2

私は推測しているだけですが、あなたの と の構造は無限のリダイレクトループSessionsController#simulate_userを公開しています。SessionsController#leave_simulation_mode

URL にアクセスして/simulate_userもサインインが機能しない場合 (else パス) にリダイレクトし/leave_simulation_modeます。サインleave_simulation_modeアウト/サインインが機能するかどうかに関係なく/simulate_userredirect_to request.referer.

に戻ると/simulate_user、ユーザーは再びサインインし、再び失敗します->再度リダイレクトします。

シミュレートされたユーザーが正しくサインインするのを何かがブロックしている場合、無限のリダイレクト ループが発生します。

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

それが役立つことを願っています!

于 2012-12-31T11:04:08.120 に答える
1

すべてのモンキーパッチを初期化子に移動します。

ActionDispatch::Request のモンキーパッチが原因で、同じ問題が発生します。ベースコントローラーにパッチを当てました。イニシャライザに置き換えると、問題が修正されました。

于 2013-03-27T13:56:05.947 に答える
0

他の回答からは明らかではありませんが、これはバージョン1.1.5で修正されたdevise_invitablegemのバグでした。GitHubの問題は次のとおりです:https ://github.com/scambra/devise_invitable/issues/252

于 2013-01-31T22:51:47.990 に答える