自动加载常量用户时检测到循环依赖性

时间:2013-08-02 09:13:34

标签: ruby-on-rails ruby devise rubygems omniauth

我已经按照本教程(http://railscasts.com/episodes/236-omniauth-part-2)使用OmniAuth和Devise创建facebook登录,我收到此错误:在我的routes.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

这是我的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

8 个答案:

答案 0 :(得分:11)

您的registrations_controller.rb保存在哪里?位置很重要。我发现我把它保存到app/controllers/devise/.时出错了。它只需要保存在app/controllers/.例如:

app/controllers/registrations_controller.rb


此外,config/routes.rb路由应定义为:

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

答案 1 :(得分:2)

我在lib中的一些类(使用config.autoload_paths += Dir["#{config.root}/lib/**/"]

时遇到了同样的问题

对我来说有助于将导轨从4.0.0.rc1切换到4.0.0

答案 2 :(得分:2)

好吧,在我的development.rb

中添加以下行后,我感到宽慰
config.middleware.delete Rack::Lock

参考: https://github.com/websocket-rails/websocket-rails/issues/101

你最后可以尝试一次。

答案 3 :(得分:2)

我遇到了类似的问题。

然后意识到我在控制器内的不同文件夹中复制了相同的文件,这导致了问题。

我有两个文件具有相同的内容:

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

答案 4 :(得分:0)

许多宝石开始在rails 4上打破,都是由于控制器无法加载的问题。 https://github.com/flyerhzm/switch_user/issues/34 https://github.com/thoughtbot/high_voltage/issues/68 https://github.com/thoughtbot/clearance/issues/276 还有更多

你应该查看gem正在创建问题的错误。 一旦你知道: 1)检查该宝石的未解决问题 2)如果该问题存在并修复,请确保您有该修复或更新gem。 3)如果没有,您可以创建一个问题并要求他们修复它。 4)如果你不想等待他们的修复,你可以形成宝石并推动它的修复    https://github.com/cashins/email_preview/commit/b34a077a954b98bd086153fae8979ad142667555   所有修复都是相同的(从指定的控制器中删除无法加载)

希望它有所帮助。

如果没有任何帮助降级您的rails版本。

答案 5 :(得分:0)

我发现这可以在development.rb中运行:

config.reload_classes_only_on_change = false

(我之前尝试删除Gemfile.lock并运行bundle update,以及更改Rails版本,如此处和其他地方所述。它们对我不起作用。)

答案 6 :(得分:0)

我用错字创建了同样的错误,我有

module EmployeeReminderssHelper

调用辅助文件时

employee_reminders_helper.rb

(注意额外的&#39;)

答案 7 :(得分:-1)

设计维基就此主题发表了这样的话:

参考:https://github.com/plataformatec/devise/wiki/How-To:-redirect-to-a-specific-page-on-successful-sign-in#preventing-redirect-loops

防止重定向循环

因为上面的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