Обнаружена круговая зависимость при автозагрузке постоянного пользователя
Я следил за этим руководством (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