web-dev-qa-db-fra.com

Dépendance circulaire détectée lors du chargement automatique constant lors du chargement constant

Tout d'abord: j'ai googlé et utilisé la recherche ici et trouvé des réponses à la même erreur mais sur des configurations différentes. Peut-être que j'ai cassé quelque chose de différent;)

Erreur:

RuntimeError at /admin/users
Circular dependency detected while autoloading constant Admin::UsersController

La structure est:

App => controllers => admin => users_controller.rb

Itinéraires:

namespace :admin do
  resources :stuff
  resources :users
end

Contrôleur d'utilisateurs:

class UsersController < Admin::BaseController
  def new
    #code
  end

  def create
    #code
  end

  def index
    #code
  end

  private

  def user_params
   #code
  end
end

Contrôleur de base administrateur

class Admin::BaseController < ApplicationController
  layout 'admin'
  before_filter :require_login
end

Utilisation de: Rails 4.1.4, Ruby 2.1.2 Qu'est-ce que j'ai fait de mal ici?)

Merci de votre aide!

Modifier:

development.rb

Rails.application.configure do
 config.cache_classes = false
 config.eager_load = false
 config.consider_all_requests_local       = true
 config.action_controller.perform_caching = false
 config.action_mailer.raise_delivery_errors = false
 config.active_support.deprecation = :log
 config.active_record.migration_error = :page_load
 config.assets.debug = true
 config.assets.raise_runtime_errors = true
end
40
tomr

Il semble que le principal problème soit que vous n'ayez pas nommé votre UsersController sous l'espace de noms Admin, ici:

class UsersController < Admin::BaseController

Solution simple:

class Admin::UsersController < Admin::BaseController

Cependant, je suggère que vous divisiez également vos espaces de noms en parties distinctes pour éviter de futurs maux de tête. Donc, au lieu de ce qui précède, faites ceci:

# app/controllers/admin/users_controller.rb
module Admin
  class UsersController < Admin::BaseController
    # ...
  end
end

Et faites de même avec tous les autres contrôleurs à espace de noms, tels que:

# app/controllers/admin/base_controller.rb
module Admin
  class BaseController < ApplicationController
    # ...
  end
end

De cette façon, comme Rails charge et charge automatiquement et ainsi de suite, il sera toujours sûr de définir le module Admin avant d'essayer de charger les classes en dessous. Parfois, vous obtenez des erreurs constantes inconnues sinon. Le raisonnement est un peu complexe, mais si vous souhaitez y jeter un œil, consultez cet article .

MISE À JOUR

Sur Rails Edge, il y a maintenant n guide officiel sur le sujet du chargement automatique des constantes .

43
pdobb