Comment renommer le contrôleur et le modèle de rails dans un projet
j'ai lancé une application Rails et tout fonctionne très 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 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 qu'il effacera le code réel de chaque fichier!
toute la solution? Merci à l'avance.
8 réponses
voici ce que je ferais:
créer un migration pour changer le nom de la table (niveau de la 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
changez le nom de votre fichier de modèle, la définition de votre classe de modèle et les associations de modèles:
- fichier renommé:
corp.rb
->store.rb
- Code de
store.rb
: changement declass Corp
pourclass Store
- renommer toutes les associations de modèles comme
has_many :corps
->has_many :stores
changez le nom de votre fichier controller et la définition de votre classe controller:
- fichier renommé:
corps_controller.rb
->stores_controller.rb
- code de
stores_controller.rb
: changerclass CorpsController
pourclass StoresController
renommer les dossiers vues. De corps
à stores
.
apporter les changements nécessaires dans les chemins du fichier config/routes.rb
, comme resources :corps
- > resources :stores
, et s'assurer que toutes les références dans le code changent de corps en magasins (corps_path, ...)
N'oubliez pas de lancer la migration:)
si le précédent n'est pas possible, essayer de supprimer le db/schema.rb et exécuter:
$ rake db:drop db:create db:migrate
en plus de la réponse Nobita, vous devez également changer les test & helper définitions de classe et noms de fichiers pour corps
en store
. plus important vous devez changer corps
en store
dans votre config/routes.rb fichier
donc au total, vous apportez des modifications au contrôleur, au modèle associé, aux vues, aux Helpers, aux Tests et aux fichiers de Routes.
je pense que ce que vous avez vu suggéré avec destroy
& generate
est une meilleure option. J'ai donné une réponse comment faire ceci ici: Rails: renommer un Controller et le modèle correspondant
j'ajoute à la réponse de Nobita (que je commenterais si j'avais assez de rep), si vous vous sentez courageux, alors les changements de noms de fichiers et de références au modèle dans votre code peuvent être quelque peu automatisés. 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 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 "151920920" ${0/corp/store}' {} \;
et il y a un utilitaire appelé rename on some *nix flavours (including Slackware) qui vous aidera à renommer les fichiers:
shopt -s globstar
rename -v corps stores app/**/*corps* config/**/*corps* test/**/*corps*
Check rename est ce que vous pensez qu'il est si, j'ai connu d'autres distributions comme Ubuntu à expédier avec un autre utilitaire du même nom (voir https://unix.stackexchange.com/questions/78621/find-rename-command-doesnt-work ). 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 tout fichier dans db/ sauf éventuellement dans vos seeds.fichier rb, donc vous voulez probablement exclure ce répertoire et faire toutes les 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 changer les noms de colonne des clés étrangères dans la base de données et changer toutes les références à ces clés étrangères dans le code:
rename_column :table, :old_id, :new_id
ou définir 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"
aussi si votre ressource inclut 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 modifié elles seront référencées incorrectement (le fichier existe à '/uploads/old/image/1/pic.jpg 'mais est recherché dans' uploads/new/...'), donc vous devrez soit supprimer et re-télécharger les images, les déplacer vers le nouveau chemin, ou peut-être changer où ils sont recherchés.
vous pouvez essayer le Rails Refactor gem too, un outil en ligne de commande pour des refacteurs simples comme renommer le modèle et le contrôleur pour les projets Rails
Utilisation:
renom et remaniements de base pour les projets de rails. Bien que ces sont pas parfait, ils feront beaucoup de travail pour vous et vous feront gagner du temps.
avant d ' utiliser, il est recommandé de état propre du dépôt ainsi, vous pouvez facilement examiner les changements.
à installer:
gem install rails_refactor
avant utilisation, assurez-vous que vous cd à la racine de votre projet rails.
pour renommer un contrôleur:
rails_refactor rename OldController NewController
- renomme contrôleur de fichier et du nom de la classe dans le fichier
- renomme contrôleur de fichier spec & nom de la classe dans le fichier
- renomme le répertoire view
- renomme un fichier de helper & nom du module dans le fichier
- mises à jour des itinéraires
pour renommer une action contrôleur:
$ rails_refactor rename DummyController.old_action new_action
- renomme contrôleur de l'action dans le contrôleur de fichier de classe
- rename les fichiers de vue pour tous les formats
pour renommer un modèle:
$ rails_refactor rename OldModel NewModel
- renomme modèle de fichier et du nom de la classe dans le fichier
- renomme le fichier spec & nom de la classe dans le fichier
- renomme la migration et le nom de la classe et les noms de table dans le fichier
...
et si vous avez des tests de modèle, vous devez changer:
fichier renommé: corp_test.RB - > store_test.rb (également pour les essais de contrôle, les essais d'intégration, les fixations, etc.)
Code de store_test.RB: Change Class Corpest pour class StoreTest.
Et toutes les références de corp dans le contrôleur, le modèle, l'intégration, montage des tests.
comme quelqu'un qui vient de terminer ce processus douloureux l'étape la plus importante est de construire assez TESTS pour vérifier autant de fonctionnalité que possible. Ils doivent couvrir non seulement le Model/controller que vous prévoyez de renommer, mais aussi toutes les autres parties de models/controllers/views. En tout cas c'est une bonne (ou peut-être même un must).
faites cette étape par itérations, parfois vous avez besoin de revenir à étapes quelques fois (5 et plus) pour découvrir des fichiers supplémentaires qui doivent être modifiés. Et maintenant pour les étapes de renommer:
- changer tous les fichiers (nom et contenu) l'inclure
Corps/Corp
enStores/Store
dansdb/migrate
dossier -
Essayez d'exécuter:
rake db:drop:tous les
rake db: create
rake db: migrate
-
changer le contenu de
db/seeds.rb
fichier. - essayez de courir:
rake db:seed --trace
(dans cette étape, vous pouvez avoir besoin de changer quelques autres fichiers de model/controller.) - Changement "151950920 de fichiers". vous devrez peut-être changer de corps.yml mais d'autres fichiers connexes (certains fichiers peuvent inclure corp_id).
- essayez d'exécuter vos tests, il est préférable de l'exécuter avec des semences fixes (ajouter:
TESTOPTS="--seed=1981"
ou tout autre nombre) - renommer en Fichiers (nom et contenu) soyez prudent parfois, vous avez besoin de changer le test et d'autres fichiers app
pour controller vous devrez faire le changement dans les endroits suivants si vous le faites manuellement :
- route
- app / views
- app / controllers
- test/contrôleurs
- app/helpers
- app/assets / javascripts /
- app/assets/css/
pour modèle, Nobita la réponse est assez bonne