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
store.rb
: Change class Corp
pour class Store
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
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:
Corps/Corp
inclus Corps/Corp
pour Stores/Store
dans db/migrate
dossier db/migrate
Essayez de courir:
rake db: drop: all
rake db: créer
rake db: migrer
Modifiez 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
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). TESTOPTS="--seed=1981"
ou tout autre nombre) pour le contrôleur, vous devrez modifier les endroits suivants si vous le faites manuellement :
pour le modèle, la réponse de Nobita est plutôt bonne