Comment renommer le contrôleur de rails et le modèle dans un projet

J’ai démarré 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 du Corps en Stores et le même (sans les s) 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 va effacer le code réel de chaque fichier!

Toute solution? Merci d’avance.

Voici ce que je ferais:

Créez une migration pour modifier le nom de la table (niveau de la firebase database). 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 le nom de votre fichier modèle, la définition de votre classe de modèle et les associations de modèles:

  • corp.rb fichier: corp.rb -> store.rb
  • Code de store.rb : Change class Corp pour class Store
  • Renommez toutes les associations de modèles comme has_many :corps -> has_many :stores

Modifiez le nom de votre fichier de contrôleur et la définition de votre classe de contrôleur:

  • corps_controller.rb fichier: corps_controller.rb -> stores_controller.rb
  • Code de stores_controller.rb : Changer de class CorpsController pour la class StoresController

Renommez les dossiers de vues. Du corps aux stores .

Apportez les modifications nécessaires dans les chemins du fichier config/routes.rb , comme resources :corps -> resources :stores , et assurez-vous que toutes les références du code changent de corps en magasins (corps_path, ...)

N'oubliez pas de lancer la migration 🙂

Si précédent n'est pas possible, essayez de supprimer la firebase database / 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 classes de test et d’ aide ainsi que les noms de fichier des corps à store . Plus important encore, vous devez changer de corps à store dans votre fichier config / routes.rb

Donc, au total, vous apportez des modifications au contrôleur, aux modèles associés, aux vues, aux assistants, aux tests et aux 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

En plus de la réponse de Nobita (que je commenterais si j’en avais assez de représentant), si vous vous sentez courageux, les modifications apscopes aux noms de fichiers et aux références au modèle dans votre code peuvent être quelque peu automatisées. Par exemple, pour modifier les références de 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, Minus et Mayus (le singulier remplace le pluriel si le pluriel ne nécessite que s et le caractère s à la fin):

 grep -rl corps | xargs sed -i 's/corps/stores/g' grep -rl Corps | xargs sed -i 's/Corps/Stores/g' 

Renommez les fichiers:

 find . -name '*corp*' -exec bash -c 'mv $0 ${0/corp/store}' {} \; 

Et il existe un utilitaire appelé renommer sur certaines versions de * 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 le renommage est ce que vous pensez, cependant, j’ai connu d’autres dissortingbutions comme Ubuntu avec un utilitaire différent du même nom (voir https://unix.stackexchange.com/questions/78621/find-rename-command- ne marche pas ). Sur Ubuntu, vous feriez ceci à la place:

 shopt -s globstar rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps* 

Notez que vous souhaitez éviter de renommer des fichiers dans la firebase database / sauf éventuellement dans votre fichier seeds.rb, vous souhaiterez probablement exclure ce répertoire et apporter des modifications manuellement.

Une autre chose importante est que vous devez mettre à jour les associations de modèles, que vous devez faire si vous renommez manuellement ou détruisez et générez la ressource (car elles existent dans les autres modèles). Vous pouvez exécuter une migration pour modifier les noms de colonne des clés étrangères dans la firebase database 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 inclut des images, elles sont souvent stockées dans un répertoire incluant le nom de la ressource, mais (avec carrierwave au moins) une fois le nom de la ressource modifié, ils seront mal référencés (le fichier existe à / uploads / old / image / 1 / pic.jpg ‘mais est recherché lors de’ uploads / new / … ‘), vous devrez donc supprimer et télécharger à nouveau les images, les déplacer vers le nouveau chemin ou peut-être changer leur emplacement’ être recherché.

Vous pouvez également essayer le joyau Rails Refactor , un outil de ligne de commande pour les refactors simples comme le modèle de renommage et le contrôleur pour les projets Rails.

Usage:

Renommage et refactorisation de base pour les projets de rails. Bien que ceux-ci ne soient pas parfaits, ils feront beaucoup de travail pour vous et vous feront gagner du temps.

Avant d’utiliser, recommandez de commencer à partir d’un état de référentiel propre afin de pouvoir examiner facilement 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écification 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 du 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 modèle et le nom de la classe dans le fichier
  • renomme le fichier de spécifications et le nom de la classe dans le fichier
  • renomme la migration et le nom de la classe et les noms des tables dans un fichier

Et si vous avez des tests de modèle, vous devez changer:

Renommer le fichier: corp_test.rb -> store_test.rb (également pour les tests de contrôleur, les tests d’intégration, le assembly, etc.)

Code de store_test.rb: Changer de classe CorpTest pour la classe StoreTest.

Et toutes les références de corp dans le contrôleur, le modèle, l’intégration, les tests de fixation.

En tant que personne qui vient juste de terminer ce processus douloureux, l’étape la plus importante est de créer suffisamment de TESTS pour 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 composants de modèles / contrôleurs / vues. Quoi qu’il en soit, c’est une bonne pratique (ou peut-être même un must).

Procédez comme suit par itérations, il est parfois nécessaire de revenir plusieurs fois sur les étapes (5 et plus) pour découvrir des fichiers supplémentaires à modifier. Et maintenant pour les étapes de renommage:

  1. Changez tous les fichiers (nom et contenu) du Corps/Corp inclus Corps/Corp pour Stores/Store dans db/migrate dossier db/migrate
  2. Essayez de courir:

    rake db: drop: all

    rake db: créer

    rake db: migrer

  3. Modifiez le contenu du fichier db/seeds.rb .

  4. Essayez de lancer: rake db:seed --trace (Dans cette étape, vous devrez peut-être modifier d’autres fichiers de modèle / contrôleur).
  5. Changer test/fixtures fichiers de test/fixtures . vous devrez peut-être changer non seulement corps.yml mais d’autres fichiers liés (certains fichiers peuvent inclure corp_id).
  6. Essayez de lancer vos tests, il est préférable de l’exécuter avec une graine fixe (add: TESTOPTS="--seed=1981" ou tout autre nombre)
  7. Renommer des fichiers (nom et contenu) doit parfois faire l’object de modifications

pour le contrôleur, vous devrez modifier les endroits suivants si vous le faites manuellement :

  • route
  • app / vues
  • app / contrôleurs
  • tests / contrôleurs
  • app / aide
  • app / assets / javascripts /
  • app / assets / stylesheets /

pour le modèle, la réponse de Nobita est plutôt bonne