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


92

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 Corpscontrôleur Storeset le même (sans fin) 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 réel de chaque fichier!

Toute solution? Merci d'avance.

Réponses:


182

Voici ce que je ferais:

Créez une 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 le nom de votre fichier de modèle, la définition de votre classe de modèle et les associations de modèles:

  • Renommer le fichier: corp.rb->store.rb
  • Code de store.rb: Changer class Corppourclass 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:

  • Renommer le fichier: corps_controller.rb->stores_controller.rb
  • Code de stores_controller.rb: Changer class CorpsControllerpourclass StoresController

Renommez les dossiers de vues. Du corpsau stores.

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

N'oubliez pas d'exécuter la migration :)

Si la précédente n'est pas possible, essayez de supprimer le db / schema.rb et exécutez:

 $ rake db:drop db:create db:migrate

2
Vous voudrez peut-être mentionner de changer config / routes.rb pour pointer toutes les routes: corps vers: stores routes
tgf

1
Je cours find -name "oldname_on_singular?*pour obtenir une liste de fichiers à renommer. Ensuite, je le copie sur calc, je le colle deux fois sur la deuxième et la troisième colonne. Sur la première colonne, j'ajoute la commande renommer et sur la dernière colonne, je change pour le nouveau nom, quelque chose comme:git mv ./spec/views/oldname ./spec/views/new name
Eduardo Santana

La liste principale est manquante en éditant les fichiers de tests avec le nouveau nom de modèle / classe, mentionné par @EduardoSantana.
user2953607

rake db:dropest super dangereux! Je vous recommande de supprimer cette ligne pour la changer en "rake db: migrate"! Les gens ont tendance à copier-coller et à courir!
Sagar Ranglani le

10

En plus de la réponse de Nobita, vous devez également modifier les définitions de classe de test et d' assistance et les noms de fichiers pour corpsen store. Plus important encore, vous devez changer corpspour storevotre config / routes.rb fichier

Donc, au total, vous apportez des modifications au contrôleur, au modèle associé, aux vues, aux aides, aux tests et aux fichiers de routes.

Je pense que ce que vous avez vu suggéré avec destroy& generateest une meilleure option. J'ai donné une réponse sur la façon de procéder ici: Rails: renommer un contrôleur et le modèle correspondant


7

Vous pouvez également essayer la gemme Rails Refactor , un outil de ligne de commande pour des refactors simples comme renommer le modèle et le contrôleur pour les projets Rails

Usage:

Renommages et refactorisations de base pour les projets de rails. Bien qu'ils ne soient pas parfaits, ils feront beaucoup de travail pour vous et vous feront gagner du temps.

Avant d'utiliser, nous vous recommandons de commencer à partir d'un état de référentiel propre afin de pouvoir facilement consulter les modifications.

À installer:
gem install rails_refactor

Avant utilisation, assurez-vous que vous avez 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'assistance 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 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 la migration et le nom de classe et les noms de table dans le fichier

...


6

J'ajoute à la réponse de Nobita (sur laquelle je commenterais si j'avais assez de représentants), si vous vous sentez courageux, les changements de noms de fichiers et les références au modèle dans votre code peuvent être quelque peu automatisés. Par exemple, pour modifier 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 le pluriel n'a besoin que du 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'

Renommer les fichiers:

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

Et il existe un utilitaire appelé renommer sur certaines saveurs * 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 changement de nom est ce que vous pensez cependant, j'ai connu d'autres distributions comme Ubuntu pour être livrées avec un utilitaire différent du même nom (voir /unix/78621/find-rename-command- ne fonctionne 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 voulez éviter de renommer des fichiers dans db / sauf éventuellement dans votre fichier seeds.rb, donc vous voudrez probablement exclure ce répertoire et apporter des modifications manuellement.


5

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 si vous détruisez et générez la ressource (puisqu'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 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 comprend des images, elles sont souvent stockées dans un répertoire qui inclut le nom de la ressource mais (avec carrierwave au moins) une fois que le nom de la ressource est changé, elles seront référencées de manière incorrecte (le fichier existe dans '/ uploads / old / image / 1 / pic.jpg 'mais est recherché dans' uploads / new / ... '), vous devrez donc soit supprimer et retélécharger les images, les déplacer vers le nouveau chemin, ou peut-être changer leur emplacement' être recherché.


0

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 montage, etc.)

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

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


0

En tant que personne qui vient de terminer ce processus douloureux, l'étape la plus importante est de créer suffisamment de TESTS pour vérifier autant de fonctionnalités que 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 pratique (ou peut-être même un must).

Faites ces étapes par itérations, parfois vous devez revenir aux étapes plusieurs fois (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. Changer tous les fichiers (nom et contenu) le comprennent Corps/Corpà Stores/Storedans le db/migratedossier
  2. Essayez de courir:

    rake db: drop: tout

    rake db: créer

    rake db: migrer

  3. Changer le contenu du db/seeds.rbfichier.

  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 test/fixturesfichiers. vous devrez peut-être modifier non seulement corps.yml mais 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 graine fixe (ajoutez: TESTOPTS="--seed=1981"ou tout autre nombre)
  7. Renommez en fichiers (nom et contenu) soyez prudent, parfois vous devez changer de test et d'autres fichiers d'application

0

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

  • route
  • app / vues
  • appli / contrôleurs
  • test / contrôleurs
  • app / helper
  • app / actifs / javascripts /
  • app / actifs / feuilles de style /

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.