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
3 Réponses :
Vous avez une erreur dans le code du contrôleur: doit être: p> pas <<< / code>, devrait être
<< / code> p> p>
merci d'avoir l'air si proche du code, mais c'est une autre faute de frappe de mon côté
La raison est simple et la réponse réside dans le mécanisme de résolution des constantes de Ruby. P>
Fondamentalement, c'est une excellente idée d'avoir un module et une classe avec le même nom. P>
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. P>
Signification, ce référencement 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. P>
Vous voudrez peut-être lire via Ce guide officiel sur les constantes de chargement dans les rails. P > manager code> Classe avec
:: code> est votre seule solution forte> si vous ne voulez pas changer la nommée. p>
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 code> me donne la même erreur dans
@theDrifter Vous pouvez facilement vérifier dans la console: exécuter manager.class code> - jusqu'à ce qu'il renvoie
module code>, pas
classe code> - vous en avez encore des Module nommé
manager code>.
@theDIDRIFter me tient posté si vous rencontrez quelque chose de nouveau ici
Hey, donc manager.class code> tourne à chaque fois pour être une classe
code>. J'ai essayé de créer un autre contrôleur appelé
manager_user_controller.rb code> dans le même dir que
manager.rb code> avec la même erreur: lorsque je démarre / redémarre le serveur, le contrôleur fonctionne, mais Par exemple, un
manager.first code> dans
gestionnaire _ * _ contrôleur.rb L'autoload échoue et CODE> API constant ininitialisé :: V1 :: ManagreResources :: usercontroller :: manager` ou
API constante ininitialisé :: V1 :: DirigeantReController :: Manager Code> Erreurs Pop Up. Ce comportement apparaît également lorsque je renommerai l'espace de nom sur
foo code>
Je suis capable d'utiliser contrôleur.first code> ou tout autre modèle par ex.
App / contrôleur / API / V1 / contrôleur.rb code> .Le serveur répond bien avec notre redémarrage, mais dès que j'appelle
gestionnaire.first aussi dans code> contrôleur # index " échoue, avec l'espace de noms étant toujours
FOO CODE> (
API constant ininitialisé :: V1 :: ControlController :: Manager code>) La console affiche alors
manager.class code> =>
classe code>.
@theDrifter Et si vous définissez config.reload_classes_only_on_change = false code>?
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 Code> - 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 Code> Le supprimer me permet d'accéder à mes modèles comme la normale :) ufff
@theDrifter content que vous ayez finalement trouvé ça!
app/controller/api/v1.......
Bonjour, oui Tous mes contrôleurs sont sous API / V1 / App / Controller / * Code> J'ai sauté ceci
Mananger code> 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 code> dans
app / modèle / manager_foo code> 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 code> 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 (...) code>." Ceci est correct pour ce cas particulier. Vous demandez pourquoi vous devez le faire pour accéder au modèle code> code>? Ou avez-vous toujours du mal à y accéder via
:: manager.find (...) code>?
@Chrispeters
:: manager.find code> 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 Code>
ManagResources Code> 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 Code> 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