web-dev-qa-db-fra.com

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

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.

81
htaidirt

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:

  • Renommer le fichier: corp.rb -> store.rb
  • Code de store.rb: Changer class Corp pour class Store
  • Renommez toutes les associations de modèles telles que has_many :corps -> has_many :stores

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

  • Renommer le fichier: corps_controller.rb -> stores_controller.rb
  • Code de 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
163
Nobita

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

9
Holly

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.

6
Dan

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é.

5
Pwnrar

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

...

4
Asme Just

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:

  1. Remplacez tous les fichiers (nom et contenu) l'include Corps/Corp par Stores/Store dans le dossier db/migrate
  2. Essayez de courir: 

    rake db: drop: all

    rake db: créer

    rake db: migrer

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

  4. Essayez d’exécuter: rake db:seed --trace (Dans cette étape, vous devrez peut-être modifier d’autres fichiers de modèle/contrôleur.)
  5. Changer les fichiers test/fixtures. vous devrez peut-être modifier non seulement corps.yml mais également d’autres fichiers associés (certains fichiers peuvent inclure corp_id).
  6. Essayez d’exécuter vos tests, il est préférable de l’exécuter avec une valeur de départ fixe (ajoutez: TESTOPTS="--seed=1981" ou n’importe quel autre nombre)
  7. Renommer en fichiers (nom et contenu) Attention, vous devez parfois modifier le fichier de test et les autres fichiers de l'application. 
0
ChaosPredictor

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.

0

pour le contrôleur, vous devrez apporter des modifications aux endroits suivants si vous le faites manuellement :

  • route 
  • app/vues
  • app/contrôleurs
  • test/contrôleurs
  • app/helper
  • app/assets/javascripts /
  • app/assets/stylesheets /

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

0
Ravi Indorey