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 Corp
fü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 CorpsController
fürclass StoresController
Benennen Sie Ansichtsordner um. Von corps
bis stores
.
Nehmen Sie die erforderlichen Änderungen an den Pfaden in der config/routes.rb
Datei 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
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
Zusätzlich zur Nobita-Antwort müssen Sie auch die Test- und Hilfsklassendefinitionen und Dateinamen für
corps
in ändernstore
. Noch wichtiger ist, sollten Sie ändern ,corps
umstore
in Ihrer config / routes.rb DateiInsgesamt 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,generate
ist eine bessere Option. Ich habe hier eine Antwort gegeben: Rails: Umbenennen eines Controllers und des entsprechenden Modellsquelle
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:
quelle
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:
Plural, Minus und Mayus (Singular ersetzt den Plural, wenn der Plural nur und s Charakter am Ende benötigt):
Dateien umbenennen:
Bei einigen * nix-Varianten (einschließlich Slackware) gibt es ein Dienstprogramm namens "Umbenennen", mit dem Sie die Dateien umbenennen können:
Ü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:
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.
quelle
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:
oder legen Sie einen benutzerdefinierten Fremdschlüssel fest, wenn Sie die Zuordnung deklarieren, die den alten Fremdschlüssel verwendet:
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.
quelle
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.
quelle
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:
Corps/Corp
umStores/Store
indb/migrate
OrdnerVersuchen Sie zu laufen:
Rechen db: drop: alle
Rechen db: erstellen
Rechen db: migrieren
Ändern Sie den Inhalt der
db/seeds.rb
Datei.rake db:seed --trace
(In diesem Schritt müssen Sie möglicherweise einige andere Modell- / Controller-Dateien ändern.)test/fixtures
Dateien ändern . Möglicherweise müssen Sie nicht nur corps.yml, sondern auch andere verwandte Dateien ändern (einige Dateien enthalten möglicherweise corp_id).TESTOPTS="--seed=1981"
oder eine andere Zahl).quelle
Für Controller müssen Sie Änderungen an folgenden Stellen vornehmen, wenn Sie dies manuell tun :
Für Model ist Nobitas Antwort ziemlich gut
quelle