So benennen Sie den Schienencontroller und das Modell in einem Projekt um

91

Ich habe eine Rails-App gestartet und alles funktioniert einwandfrei. Aber jetzt möchte ich einen Controller und das zugehörige Modell umbenennen:

Ich wollte den CorpsController Storesfür das Modell auf und das gleiche (ohne letzte s) ändern .

Bei Google schlugen die Leute vor, den Controller und das Modell zu zerstören und dann erneut zu generieren. Das Problem ist, dass der tatsächliche Code jeder Datei gelöscht wird!

Irgendeine Lösung? Danke im Voraus.

htaidirt
quelle

Antworten:

180

Folgendes würde ich tun:

Erstellen Sie eine Migration , um den Tabellennamen (Datenbankebene) zu ändern. Ich nehme an, Ihr alter Tisch heißt Corps . Der Migrationsinhalt lautet:

class RenameCorpsToStores < ActiveRecord::Migration
  def change
    rename_table :corps, :stores
  end
end

Ändern Sie den Namen Ihrer Modelldatei, Ihre Modellklassendefinition und die Modellzuordnungen:

  • Umbenennen der Datei: corp.rb->store.rb
  • Code of store.rb: Änderung class Corpfürclass Store
  • Benennen Sie alle Modellzuordnungen wie has_many :corps-> umhas_many :stores

Ändern Sie den Namen Ihrer Controller-Datei und Ihre Definition der Controller-Klasse:

  • Umbenennen der Datei: corps_controller.rb->stores_controller.rb
  • Code of stores_controller.rb: Änderung class CorpsControllerfürclass StoresController

Benennen Sie Ansichtsordner um. Von corpsbis stores.

Nehmen Sie die erforderlichen Änderungen an den Pfaden in der config/routes.rbDatei vor, z. B. resources :corps-> resources :stores, und stellen Sie sicher, dass sich alle Verweise im Code von Corps zu Stores ändern (corps_path, ...).

Denken Sie daran, die Migration auszuführen :)

Wenn dies nicht möglich ist, versuchen Sie, die Datei db / schema.rb zu löschen, und führen Sie Folgendes aus:

 $ rake db:drop db:create db:migrate
Nobita
quelle
2
Vielleicht möchten Sie erwähnen, dass config / route.rb so geändert wird, dass alle: corps-Routen auf: speichern Routen
verweisen
1
Ich renne find -name "oldname_on_singular?*, um eine Liste der Dateien zu erhalten, die umbenannt werden sollen. Dann kopiere ich es auf calc, füge es zweimal in die zweite und dritte Spalte ein. In der ersten Spalte füge ich den Umbenennungsbefehl hinzu und in der letzten Spalte ändere ich den neuen Namen, etwa:git mv ./spec/views/oldname ./spec/views/new name
Eduardo Santana
In der Hauptliste fehlt die Bearbeitung der Testdateien mit dem neuen Modell- / Klassennamen, der von @EduardoSantana erwähnt wird.
user2953607
10

Zusätzlich zur Nobita-Antwort müssen Sie auch die Test- und Hilfsklassendefinitionen und Dateinamen für corpsin ändern store. Noch wichtiger ist, sollten Sie ändern , corpsum storein Ihrer config / routes.rb Datei

Insgesamt nehmen Sie also Änderungen an den Dateien Controller, zugehöriges Modell, Ansichten, Helfer, Tests und Routen vor.

Ich denke, was Sie mit destroy& vorgeschlagen haben, generateist eine bessere Option. Ich habe hier eine Antwort gegeben: Rails: Umbenennen eines Controllers und des entsprechenden Modells

Stechpalme
quelle
7

Sie können auch das Juwel Rails Refactor ausprobieren , ein Befehlszeilenprogramm für einfache Refactors wie Modell umbenennen und Controller für Rails-Projekte

Verwendung:

Grundlegende Umbenennungen und Umgestaltungen für Schienenprojekte. Obwohl diese nicht perfekt sind, erledigen sie einen Großteil der Arbeit für Sie und sparen Ihnen Zeit.

Empfehlen Sie vor der Verwendung, dass Sie von einem sauberen Repository-Status ausgehen, damit Sie Änderungen problemlos überprüfen können.

Installieren:
gem install rails_refactor

Stellen Sie vor der Verwendung sicher, dass Sie sich im Stammverzeichnis Ihres Rails-Projekts befinden.

So benennen Sie einen Controller um:
rails_refactor rename OldController NewController

  • Benennt die Controller-Datei und den Klassennamen in der Datei um
  • Benennt die Controller-Spezifikationsdatei und den Klassennamen in der Datei um
  • benennt das Ansichtsverzeichnis um
  • Benennt die Hilfsdatei und den Modulnamen in der Datei um
  • aktualisiert Routen

So benennen Sie eine Controller-Aktion um:
$ rails_refactor rename DummyController.old_action new_action

  • Benennt die Controller-Aktion in der Controller-Klassendatei um
  • Benennt Ansichtsdateien für alle Formate um

So benennen Sie ein Modell um:
$ rails_refactor rename OldModel NewModel

  • Benennt die Modelldatei und den Klassennamen in der Datei um
  • Benennt die Spezifikationsdatei und den Klassennamen in der Datei um
  • Benennt Migration & Klassennamen & Tabellennamen in Datei um

...

Asme Just
quelle
6

Zusätzlich zu Nobitas Antwort (die ich kommentieren würde, wenn ich genug Wiederholungen hätte), wenn Sie sich mutig fühlen, können die Änderungen an Dateinamen und Verweisen auf das Modell in Ihrem Code etwas automatisiert werden. Zum Beispiel, um Referenzen in Ihrem Code zu ändern, können Sie verwenden

Singular, Minus und Mayus:

grep -rl corp | xargs sed -i 's/corp/store/g'
grep -rl Corp | xargs sed -i 's/Corp/Store/g'

Plural, Minus und Mayus (Singular ersetzt den Plural, wenn der Plural nur und s Charakter am Ende benötigt):

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

Dateien umbenennen:

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

Bei einigen * nix-Varianten (einschließlich Slackware) gibt es ein Dienstprogramm namens "Umbenennen", mit dem Sie die Dateien umbenennen können:

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

Überprüfen Sie, ob das Umbenennen Ihrer Meinung nach so ist. Ich kenne andere Distributionen wie Ubuntu, die mit einem anderen Dienstprogramm mit demselben Namen ausgeliefert werden (siehe /unix/78621/find-rename-command-). funktioniert nicht ). Unter Ubuntu würden Sie dies stattdessen tun:

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

Beachten Sie, dass Sie das Umbenennen von Dateien in db / vermeiden möchten, außer möglicherweise in Ihrer seeds.rb-Datei. Daher möchten Sie dieses Verzeichnis wahrscheinlich ausschließen und Änderungen manuell vornehmen.

Dan
quelle
5

Eine weitere wichtige Sache ist, dass Sie die Modellzuordnungen aktualisieren müssen. Dies müssen Sie tun, unabhängig davon, ob Sie die Ressource manuell umbenennen oder zerstören und generieren (da sie in den anderen Modellen vorhanden sind). Sie können entweder eine Migration ausführen, um die Spaltennamen der Fremdschlüssel in der Datenbank zu ändern, und alle Verweise auf diese Fremdschlüssel im Code ändern:

rename_column :table, :old_id, :new_id

oder legen Sie einen benutzerdefinierten Fremdschlüssel fest, wenn Sie die Zuordnung deklarieren, die den alten Fremdschlüssel verwendet:

belongs_to :new, foreign_key: "old_id"

Auch wenn Ihre Ressource Bilder enthält, werden diese häufig in einem Verzeichnis gespeichert, das den Ressourcennamen enthält. Sobald jedoch der Name der Ressource geändert wird, werden sie (zumindest mit Carrierwave) falsch referenziert (Datei existiert unter '/ uploads / old / image / 1 / pic.jpg ', wird aber unter' uploads / new / ... 'gesucht. Sie müssen die Bilder also entweder löschen und erneut hochladen, sie auf den neuen Pfad verschieben oder möglicherweise ändern, wo sie sich befinden.' werden gesucht.

Pwnrar
quelle
0

Und wenn Sie Modelltests haben, müssen Sie Folgendes ändern:

Umbenennen der Datei: corp_test.rb -> store_test.rb (auch für Controller-Tests, Integrationstests, Fixture usw.)

Code von store_test.rb: Ändern Sie die Klasse CorpTest für die Klasse StoreTest.

Und alle Referenzen von corp in den Controller-, Modell-, Integrations- und Fixture-Tests.

Benjamin J. Benoudis
quelle
0

Als jemand, der gerade diesen schmerzhaften Prozess beendet hat, besteht der wichtigste Schritt darin, genügend TESTS zu erstellen , um so viele Funktionen wie möglich zu überprüfen. Sie sollten nicht nur das Modell / den Controller abdecken, das Sie umbenennen möchten, sondern auch alle anderen Modelle / Controller / Ansichten. Jedenfalls ist es eine gute (oder vielleicht sogar ein Muss) Übung.

Führen Sie diese Schritte durch Iterationen aus. Manchmal müssen Sie einige Male (5 und mehr) zu den Schritten zurückkehren, um zusätzliche Dateien zu ermitteln, die geändert werden müssen. Und nun zu den Umbenennungsschritten:

  1. Ändern Sie alle Dateien (Name und Inhalt) umfassen , Corps/Corpum Stores/Storein db/migrateOrdner
  2. Versuchen Sie zu laufen:

    Rechen db: drop: alle

    Rechen db: erstellen

    Rechen db: migrieren

  3. Ändern Sie den Inhalt der db/seeds.rbDatei.

  4. Versuchen Sie Folgendes auszuführen: rake db:seed --trace(In diesem Schritt müssen Sie möglicherweise einige andere Modell- / Controller-Dateien ändern.)
  5. test/fixturesDateien ändern . Möglicherweise müssen Sie nicht nur corps.yml, sondern auch andere verwandte Dateien ändern (einige Dateien enthalten möglicherweise corp_id).
  6. Versuchen Sie, Ihre Tests auszuführen. Es ist besser, sie mit einem festen Startwert auszuführen (add: TESTOPTS="--seed=1981"oder eine andere Zahl).
  7. Umbenennen in Dateien (Name und Inhalt) Seien Sie vorsichtig, manchmal müssen Sie Test- und andere App-Dateien ändern
ChaosPredictor
quelle
0

Für Controller müssen Sie Änderungen an folgenden Stellen vornehmen, wenn Sie dies manuell tun :

  • Route
  • App / Ansichten
  • App / Controller
  • Test / Controller
  • App / Helfer
  • App / Assets / Javascripts /
  • App / Assets / Stylesheets /

Für Model ist Nobitas Antwort ziemlich gut

Ravi
quelle