7
votes

Espaces de noms imbriqués pour les contrôleurs dans les rails

J'ai refactored mon application Rails de manière à ce que, pour chaque substitut, je crée un contrôleur est l'espace de noms en fonction.

 class Api::V1::Manager < Api::ApiBaseController
   def index
     puts User.class #=> class
     ::puts Manager.class #=> class
     puts Manager.class  #=> class
     puts Controller.class  #=> class
     ...
   end
 end


11 commentaires

Mananger mot a une erreur. Est-ce que c'est bon?


AAH oui juste une faute de frappe;)


Peut-être que l'ID de module de gestionnaire en conflit avec le gestionnaire Modelo, essayez de modifier le nom du module Manager


@ArielJuod Oui Modification du nom de app / modèle / manager.rb dans app / modèle / manager_foo me permet de travailler avec `managerfoo.find (...) mais je pas sûr de comprendre ce que cela signifie


J'ai également essayé de mettre le modèle de gestionnaire sous app / modèle / manager / manager.rb sans succès


@arieljuod je n'utilise pas de module Manager, j'ai le dossier Manager dans le répertoire du contrôleur pour l'espace de noms.


L'espace de nom fonctionne comme un module, le problème semble être que le gestionnaire est ambigu, vous devez indiquer des rails à quel gestionnaire que vous voulez, je ne suis pas sûr s'il y a un espace de noms d'enveloppement de tous les modèles, j'irais passer à l'API :: V1 :: ManagerAPI :: Ou quelque chose d'autre


Oui c'est ça! Vous avez raison, c'est le problème, je renommerai l'espace de noms et les itinéraires et maintenant les actions du contrôleur fonctionnent à nouveau !! Merci


Ah non. Cela n'a fonctionné que parce que j'avais encore un :: manager.find () dès que j'ai enlevé les doubles couches, j'ai à nouveau le même message d'erreur ...


"La solution consiste à utiliser le préfixe du double côlon avec l'appel :: manager.find (...) ." Ceci est correct pour ce cas particulier. Vous demandez pourquoi vous devez le faire pour accéder au modèle ? Ou avez-vous toujours du mal à y accéder via :: manager.find (...) ?


@Chrispeters :: manager.find fonctionne mais j'aimerais avoir une façon d'utiliser tous les modèles directement. J'ai essayé des noms différents pour l'espace de noms comme ManagErresources ManagResources J'ai imaginé l'écrire en un mot empêchant la rubis de trompier la classe et le modèle (espaces de noms) mais je reçois la même erreur, mais aussi Renommer cela à Ressources m'a reçu l'erreur. Ma question est de savoir comment suis-je capable d'utiliser tous les modèles de la même manière sous des contrôleurs espacés


3 Réponses :


0
votes

Vous avez une erreur dans le code du contrôleur: xxx

doit être: xxx

pas <<< / code>, devrait être << / code>


1 commentaires

merci d'avoir l'air si proche du code, mais c'est une autre faute de frappe de mon côté



1
votes

La raison est simple et la réponse réside dans le mécanisme de résolution des constantes de Ruby.

Fondamentalement, c'est une excellente idée d'avoir un module et une classe avec le même nom.

Mais si vous avez certainement besoin d'avoir le même nom pour le module et la classe, assurez-vous de référencer correctement chacun d'eux.

Signification, ce référencement manager Classe avec :: est votre seule solution si vous ne voulez pas changer la nommée.

rails ajoutez une magie aux classes automatiques / préchargements en mode de développement et de production afin de pouvoir faire face à des problèmes différents dans différents modes.

Vous voudrez peut-être lire via Ce guide officiel sur les constantes de chargement dans les rails.


12 commentaires

Ok grand merci pour l'article super intéressant! Mais je suis ouvert pour le renommer, mais changer l'espace de noms pour gestionnaire sous-ressources vers API / V1 / Controller / Ressources / user.rb me donne la même erreur dans


@theDrifter Vous pouvez facilement vérifier dans la console: exécuter manager.class - jusqu'à ce qu'il renvoie module , pas classe - vous en avez encore des Module nommé manager .


@theDIDRIFter me tient posté si vous rencontrez quelque chose de nouveau ici


Hey, donc manager.class tourne à chaque fois pour être une classe . J'ai essayé de créer un autre contrôleur appelé manager_user_controller.rb dans le même dir que manager.rb avec la même erreur: lorsque je démarre / redémarre le serveur, le contrôleur fonctionne, mais Par exemple, un manager.first dans gestionnaire _ * _ contrôleur.rb L'autoload échoue et API constant ininitialisé :: V1 :: ManagreResources :: usercontroller :: manager` ou API constante ininitialisé :: V1 :: DirigeantReController :: Manager Erreurs Pop Up. Ce comportement apparaît également lorsque je renommerai l'espace de nom sur foo


Je suis capable d'utiliser contrôleur.first ou tout autre modèle par ex. App / contrôleur / API / V1 / contrôleur.rb .Le serveur répond bien avec notre redémarrage, mais dès que j'appelle gestionnaire.first aussi dans contrôleur # index " échoue, avec l'espace de noms étant toujours FOO ( API constant ininitialisé :: V1 :: ControlController :: Manager ) La console affiche alors manager.class => classe .


@theDrifter Et si vous définissez config.reload_classes_only_on_change = false ?


ok je pense que j'ai trouvé quelque chose d'intéressant, je mette à jour la question ..again;) merci d'avoir collé ici !!!


@theDrifter Ce n'est pas une chose triviale avec laquelle vous jouez;) Découvrez Ce fil - La réponse de Sergio est géniale.


oh génial ça comme c'est super !!


@theDrifter Yeap, ce genre de choses est vraiment bon à comprendre. Mais je pense qu'à la fin, vous allez coller à :: Manager - Juste pour vous assurer que les rails 'AutoLoading Magic ne brise pas votre application;)


Ok, je pense que j'ai trouvé le "bogue" J'ai utilisé les générateurs de rails pour créer les sous-sortes en premier lieu, il y avait donc des fichiers d'assistance également générés. Ils ont défini quelque chose API de module :: Managerhelper Le supprimer me permet d'accéder à mes modèles comme la normale :) ufff


@theDrifter content que vous ayez finalement trouvé ça!



0
votes
app/controller/api/v1.......

1 commentaires

Bonjour, oui Tous mes contrôleurs sont sous API / V1 / App / Controller / * J'ai sauté ceci