J'ai lancé une application Rails et tout fonctionne bien. Mais maintenant, je voudrais renommer un contrôleur et le modèle associé:
Je voulais changer le contrôleur Corps
en Stores
et le même (sans s final) pour le modèle.
En regardant sur Google, les gens ont suggéré de détruire puis de générer à nouveau le contrôleur et le modèle. Le problème est que cela effacera le code de chaque fichier!
Toute solution? Merci d'avance.
Voici ce que je ferais:
Créez un migration pour changer le nom de la table (niveau base de données). Je suppose que votre ancienne table s'appelle corps . Le contenu de la migration sera:
class RenameCorpsToStores < ActiveRecord::Migration
def change
rename_table :corps, :stores
end
end
Modifiez votre nom de fichier de modèle, votre définition de classe de modèle et les associations de modèles:
corp.rb
-> store.rb
store.rb
: Changer class Corp
pour class Store
has_many :corps
-> has_many :stores
Changez le nom de votre fichier de contrôleur et votre définition de classe de contrôleur:
corps_controller.rb
-> stores_controller.rb
stores_controller.rb
: Changer class CorpsController
pour class StoresController
Renommez les dossiers de vues. De corps
à stores
.
Effectuez les modifications nécessaires dans les chemins du fichier config/routes.rb
, tels que resources :corps
-> resources :stores
et assurez-vous que toutes les références du code changent de corps en magasins (chemin_corps, ...).
N'oubliez pas de lancer la migration :)
Si précédent n'est pas possible, essayez de supprimer la base de données/schema.rb et exécutez:
$ rake db:drop db:create db:migrate
En plus de la réponse Nobita, vous devez également modifier les définitions de classe et les noms de fichiers test et helper pour corps
à store
. Plus important encore vous devriez changer corps
en store
dans votre fichier config/routes.rb
Au total, vous apportez donc des modifications aux fichiers Controller, Modèle associé, Vues, Aide, Tests et Itinéraires.
Je pense que ce que vous avez vu suggéré avec destroy
& generate
est une meilleure option. J'ai donné une réponse à cette question: Rails: renommer un contrôleur et le modèle correspondant
J'ajoute à la réponse de Nobita (que je commenterais si j'avais assez de représentants), si vous vous sentez courageux, les modifications apportées aux noms de fichiers et aux références au modèle dans votre code peuvent être quelque peu automatisées. Par exemple, pour changer les références dans votre code, vous pouvez utiliser
Singulier, moins et mayus:
grep -rl corp | xargs sed -i 's/corp/store/g'
grep -rl Corp | xargs sed -i 's/Corp/Store/g'
Pluriel, moins et mayus (le singulier remplace le pluriel si pluriel ne nécessite que le caractère à la fin):
grep -rl corps | xargs sed -i 's/corps/stores/g'
grep -rl Corps | xargs sed -i 's/Corps/Stores/g'
Renommer les fichiers:
find . -name '*corp*' -exec bash -c 'mv $0 ${0/corp/store}' {} \;
Et il existe un utilitaire appelé renommer sur certaines versions * nix (y compris Slackware) qui vous aidera à renommer les fichiers:
shopt -s globstar
rename -v corps stores app/**/*corps* config/**/*corps* test/**/*corps*
Vérifiez que renommer est ce que vous pensez, cependant, je connais d’autres distributions comme Ubuntu qui sont livrées avec un utilitaire différent du même nom (voir https://unix.stackexchange.com/questions/78621/find-rename- commande-ne fonctionne pas ). Sur Ubuntu, vous feriez plutôt ceci:
shopt -s globstar
rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps*
Notez que vous souhaitez éviter de renommer des fichiers dans db/sauf éventuellement dans votre fichier seeds.rb. Vous souhaiterez donc probablement exclure ce répertoire et y apporter des modifications manuellement.
Une autre chose importante est que vous devez mettre à jour les associations de modèles, ce que vous devrez faire si vous renommez manuellement ou détruisez et générez la ressource (puisqu'elles existent dans les autres modèles). Vous pouvez soit exécuter une migration pour modifier les noms de colonne des clés étrangères de la base de données et modifier toutes les références à ces clés étrangères dans le code:
rename_column :table, :old_id, :new_id
ou définissez une clé étrangère personnalisée lors de la déclaration de l'association qui utilise l'ancienne clé étrangère:
belongs_to :new, foreign_key: "old_id"
De plus, si votre ressource contient des images, elles sont souvent stockées dans un répertoire contenant le nom de la ressource mais, une fois le nom de la ressource modifié, (avec carrierwave au moins), elles ne seront pas correctement référencées (le fichier existe dans '/ uploads/old/image/1/pic.jpg 'mais est recherché dans' uploads/new/... '), vous devrez donc supprimer et re-télécharger les images, les déplacer dans le nouveau chemin ou peut-être changer leur emplacement' être recherché.
Vous pouvez aussi essayer le refactor de Rails gem, un outil en ligne de commande pour de simples refactors tels que renommer le modèle et le contrôleur pour les projets Rails.
Utilisation:
Renommer et refactoriser les bases pour les projets Rails. Bien que ce soit pas parfait, ils vont faire beaucoup de travail pour vous et vous faire gagner du temps.
Avant de l'utiliser, nous vous recommandons de démarrer à partir d'un état de référentiel propre afin que vous puissiez facilement examiner les modifications.
À installer:
gem install Rails_refactor
Avant utilisation, assurez-vous de cd à la racine de votre projet Rails.
Pour renommer un contrôleur:
Rails_refactor rename OldController NewController
- renomme le fichier du contrôleur et le nom de la classe dans le fichier
- renomme le fichier de spécifications du contrôleur et le nom de la classe dans le fichier
- renomme le répertoire de vue
- renomme le fichier d'aide et le nom du module dans le fichier
- met à jour les itinéraires
Pour renommer une action de contrôleur:
$ Rails_refactor rename DummyController.old_action new_action
- renomme l'action du contrôleur dans le fichier de classe du contrôleur
- renomme les fichiers de vue pour tous les formats
Pour renommer un modèle:
$ Rails_refactor rename OldModel NewModel
- renomme le fichier de modèle et le nom de la classe dans le fichier
- renomme le fichier de spécification et le nom de la classe dans le fichier
- renomme les noms de migration et de classe et de table dans le fichier
...
En tant que personne qui vient de terminer ce processus douloureux, l’essentiel est de construire suffisamment deTESTSpour vérifier le plus de fonctionnalités possible. Ils doivent couvrir non seulement le modèle/contrôleur que vous prévoyez de renommer, mais également tous les autres modèles, contrôleurs/vues. Quoi qu'il en soit, c'est une bonne (ou peut-être même un must) pratique.
Faites ces étapes par itérations, il est parfois nécessaire de revenir à plusieurs étapes (5 et plus) pour découvrir des fichiers supplémentaires qui doivent être modifiés . Et maintenant, pour les étapes de changement de nom:
Corps/Corp
par Stores/Store
dans le dossier db/migrate
Essayez de courir:
rake db: drop: all
rake db: créer
rake db: migrer
Changer le contenu du fichier db/seeds.rb
.
rake db:seed --trace
(Dans cette étape, vous devrez peut-être modifier d’autres fichiers de modèle/contrôleur.)test/fixtures
. vous devrez peut-être modifier non seulement corps.yml mais également d’autres fichiers associés (certains fichiers peuvent inclure corp_id).TESTOPTS="--seed=1981"
ou n’importe quel autre nombre)Et si vous avez des tests sur modèles, vous devez changer:
Renommer le fichier: corp_test.rb -> store_test.rb (également pour les tests de contrôleur, les tests d'intégration, les fixtures, etc.)
Code de store_test.rb: Modifiez la classe CorpTest pour la classe StoreTest.
Et toutes les références de corp dans le contrôleur, modèle, intégration, tests de fixtures.
pour le contrôleur, vous devrez apporter des modifications aux endroits suivants si vous le faites manuellement :
pour modèle, la réponse de Nobita est plutôt bonne