Alon Shmiel
Alon Shmiel

Reputation: 7121

error: Too many redirects

I'm using devise and trying the next following:

class ApplicationController < ActionController::Base
   protect_from_forgery
   before_filter :is_worker

   def is_worker
     if user_signed_in?
        @email = current_user.email
        if @email && Worker.find_by_email(@email).nil?
          redirect_to '/tasksadmins'
        else
           redirect_to '/workers'
        end
     else
         redirect_to '/users/sign_in'
     end
   end
end

when I try to enter the site: localhost:3000/tasksadmins, I got:

Oops! It was not possible to show this website

The website at http://localhost:3000/tasksadmins seems to be unavailable. The precise error was:

Too many redirects

It could be temporarily switched off or moved to a new address. Don't forget to check that your internet connection is working correctly.

How can I fix it please?

Upvotes: 3

Views: 10103

Answers (2)

Pawan Bharti
Pawan Bharti

Reputation: 49

In my case:

users_controller.rb

  before_action :logged_in?, only: :new

  def new
    @user = User.new
    render layout: "session"
  end

and

application_controller.rb

def logged_in?
    redirect_to users_new_url unless current_user.present?
end

When I was trying to redirect to the 'users/new' page,same error occurred. This is just because I'm trying to redirect to the 'users/new' page and "def logged_in?" is also redirecting to the same page.

Then I changed the application_controller.rb code like this:

def logged_in?
    redirect_to root_url unless current_user.blank?
end

Error_Resolved.

Upvotes: 0

Koraktor
Koraktor

Reputation: 42933

before_filter is applied to every single request. That's why it's redirecting again and again.

You might want to only filter specific actions:

before_filter :is_worker, only: :index

Another solution would be to check wether a redirect is necessary in #is_worker:

redirect_to '/workers' unless request.fullpath == '/workers'

EDIT:

Another way would be to skip the before filter for the target actions of your redirects. Example:

class WorkersController < ApplicationController

  skip_before_filter :is_worker, only: :index

  # …

end

Upvotes: 8

Related Questions