Обнаружена круговая зависимость при автозагрузке постоянного пользователя

Я следил за этим руководством (http://railscasts.com/episodes/236-omniauth-part-2) для создания входа в facebook с помощью OmniAuth и Devise, и я получаю эту ошибку: обнаружена круговая зависимость при автозагрузке постоянного пользователя на моих маршрутах .rb

  devise_for :users , :controllers => {:registrations => 'registrations'}

registrations_controller.rb

Class RegistrationsController < Devise::RegistrationsController

  def create
    super
    session[:omniauth] = nil unless @user.new_record?
  end

  private

  def build_resource(*args)
    super
    if session["devise.omniauth"]
      @user.apply_omniauth(session["devise.omniauth"])
      session["devise.omniauth"] = nil
   end
  end
end

и здесь мой метод create из AuthenticationsController

def create
    omniauth = request.env["omniauth.auth"]
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
    if authentication
      flash[:notice] = "Signed in successfully."
      sign_in_and_redirect(:user, authentication.user)
    elsif current_user
      current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'])
      flash[:notice] = "Authentication successful."
      redirect_to authentications_url
    else
      user = User.new
      user.apply_omniauth(omniauth)
      if user.save
        flash[:notice] = "Signed in successfully."
        sign_in_and_redirect(:user, user)
      else
        session[:omniauth] = omniauth.except('extra')
        redirect_to new_user_registration_url
      end
    end
end

Ответ 1

Где был сохранен ваш registrations_controller.rb? Место очень важно. Я обнаружил, что сделал ошибку, сохранив ее до app/controllers/devise/.. Его просто нужно было сохранить в app/controllers/. например:

app/controllers/registrations_controller.rb


Кроме того, маршрут config/routes.rb должен быть определен как:

devise_for :users, controllers: { registrations: 'registrations' }

Ответ 2

У меня такая же проблема с некоторыми классами в lib (используется config.autoload_paths += Dir["#{config.root}/lib/**/"])

для меня помогли переключить рельсы от 4.0.0.rc1 до 4.0.0

Ответ 3

Ну, я получил облегчение после добавления следующей строки в моей development.rb

config.middleware.delete Rack::Lock

Ссылка: https://github.com/websocket-rails/websocket-rails/issues/101

Вы можете попробовать это однажды.

Ответ 4

У меня была аналогичная проблема.

И затем понял, что у меня есть тот же файл, который дублируется в разных папках внутри контроллера, и это вызывало проблему.

У меня были оба файла с одним и тем же содержимым:

  app/controllers/logs_controller.rb
  app/controllers/api/logs_controller.rb

Ответ 5

много камней начали ломаться по рельсам 4, все из-за проблемы разгрузки в контроллерах. https://github.com/flyerhzm/switch_user/issues/34 https://github.com/thoughtbot/high_voltage/issues/68 https://github.com/thoughtbot/clearance/issues/276 и многое другое

вы должны заглянуть в ошибки, из-за которых камень создает проблему. Как только вы это знаете: 1) Проверьте открытые проблемы этого драгоценного камня 2) Если эта проблема существует и исправлена, убедитесь, что у вас есть это исправление или обновите драгоценный камень. 3) Если нет, вы можете создать проблему и попросить ее исправить ее. 4) Если вы не хотите ждать их исправления, вы можете создать драгоценный камень и нажать на него исправление  https://github.com/cashins/email_preview/commit/b34a077a954b98bd086153fae8979ad142667555все исправления одинаковы (удаление выгружается из указанного контроллера)

Надеюсь, что это поможет.

если ничто не помогает понизить версию вашего рельса.

Ответ 6

Я нашел, что это работает в development.rb:

config.reload_classes_only_on_change = false

(Я ранее пытался удалить Gemfile.lock и запустить обновление пакета, а также изменить версию Rails, как упоминалось здесь и в другом месте. Они не работали для меня.)

Ответ 7

Я создал ту же ошибку с опечаткой, у меня был

module EmployeeReminderssHelper

когда вспомогательный файл был вызван

employee_reminders_helper.rb

(Обратите внимание на дополнительные 's')

Ответ 8

Разработчик wiki имел это, чтобы сказать по теме:

Ссылка: https://github.com/plataformatec/devise/wiki/How-To:-redirect-to-a-specific-page-on -successful-вход # предотвращения переадресации-петля

Предотвращение циклов перенаправления

Поскольку код для after_sign_in_path_for выше проверяет, действительно ли request.referer == sign_in_url, эти методы (которые вызывают after_sign_in_path_for) также должны быть переопределены (иначе вы столкнетесь с циклами перенаправления):

Devise::PasswordsController#after_resetting_password_path_for
Devise::RegistrationsController#after_sign_up_path_for
Devise::RegistrationsController#after_update_path_for

Это можно сделать так:

# routes.rb
devise_for :users, controllers: { registrations: 'users/registrations', passwords: 'users/passwords' }

# users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  protected
    def after_sign_up_path_for(resource)
      signed_in_root_path(resource)
    end

    def after_update_path_for(resource)
      signed_in_root_path(resource)
    end
end

# users/passwords_controller.rb
class Users::PasswordsController < Devise::PasswordsController
  protected
    def after_resetting_password_path_for(resource)
      signed_in_root_path(resource)
    end
end