webentwicklung-frage-antwort-db.com.de

So benennen Sie den Rails-Controller und das Modell in einem Projekt um

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

Ich wollte den Corps-Controller in Stores und das gleiche (ohne abschließende s) für das Modell ändern.

Bei Google haben die Leute vorgeschlagen, den Controller und das Modell zu zerstören und dann erneut zu generieren. Das Problem ist, dass der eigentliche Code jeder Datei gelöscht wird!

Irgendeine Lösungsmöglichkeit? Danke im Voraus.

81
htaidirt

Folgendes würde ich tun:

Erstellen Sie eine migration , um den Tabellennamen (Datenbankebene) zu ändern. Ich nehme an, Ihre alte Tabelle heißt corps . Der Migrationsinhalt wird sein:

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

Ändern Sie den Namen der Modelldatei, die Definition der Modellklasse und die Modellzuordnungen:

  • Umbenennen der Datei: corp.rb -> store.rb
  • Code von store.rb: class Corp für class Store ändern
  • Benennen Sie alle Modellassoziationen wie has_many :corps -> has_many :stores um.

Ändern Sie Ihren Controller-Dateinamen und Ihre Controller-Klassendefinition:

  • Umbenennen der Datei: corps_controller.rb -> stores_controller.rb
  • Code von stores_controller.rb: class CorpsController für class StoresController ändern

Umbenennen von Ansichtenordnern Von corps bis stores.

Nehmen Sie die erforderlichen Änderungen in den Pfaden in der config/routes.rb-Datei vor, z. B. resources :corps -> resources :stores, und stellen Sie sicher, dass alle Verweise im Code von corps zu shops (corps_path, ...) geändert werden.

Denken Sie daran, die Migration auszuführen :)

Wenn vorherige 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
163
Nobita

Zusätzlich zur Nobita-Antwort müssen Sie die test & helper -Klassendefinitionen und Dateinamen für corps in store ändern. Wichtiger Sie sollten corps in store in Ihrer config/routes.rb -Datei ändern

Insgesamt nehmen Sie also Änderungen am Controller, den dazugehörigen Dateien Modell, Ansichten, Helfer, Tests und Routen vor. 

Ich denke, was Sie mit destroy & generate vorgeschlagen gesehen haben, ist eine bessere Option. Ich habe hier eine Antwort gegeben, wie das geht: Rails: Umbenennen eines Controllers und entsprechendes Modell

9
Holly

Ich füge zusätzlich zu Nobitas Antwort hinzu (die ich kommentieren würde, wenn ich genug Vertreter 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. Beispielsweise können Sie Verweise in Ihrem Code ändern, die Sie verwenden können

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 ersetzen den Plural, wenn nur Plural benötigt wird und s-Zeichen am Ende):

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 "rename", mit dem Sie die Dateien umbenennen können:

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

Check umbenennen ist das, was Sie denken, es ist jedoch, ich habe andere Distributionen wie Ubuntu mit einem anderen Dienstprogramm mit demselben Namen ausgeliefert (siehe https://unix.stackexchange.com/questions/78621/find-rename- Befehl-nicht-Arbeit ). Auf Ubuntu würden Sie stattdessen Folgendes 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 wahrscheinlich dieses Verzeichnis ausschließen und Änderungen manuell vornehmen.

6
Dan

Eine weitere wichtige Sache ist, dass Sie die Modellzuordnungen aktualisieren müssen, was Sie tun müssen, wenn Sie manuell umbenennen oder die Ressource 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 zu ändern:

rename_column :table, :old_id, :new_id

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

belongs_to :new, foreign_key: "old_id"

Wenn Ihre Ressource Bilder enthält, werden diese häufig in einem Verzeichnis gespeichert, das den Ressourcennamen enthält. Wenn jedoch der Ressourcenname geändert wird, werden sie falsch referenziert (Datei existiert unter '/ uploads/old/image/1/pic.jpg ', wird jedoch unter' uploads/new/... ') gesucht, Sie müssen also entweder die Bilder löschen und erneut hochladen, sie in den neuen Pfad verschieben oder vielleicht ändern, wo sie' sind. ' gesucht werden.

5
Pwnrar

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

Verwendung:

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

Es wird empfohlen, vor der Verwendung von einem sauberen Repository-Status aus zu beginnen, damit Sie Änderungen problemlos überprüfen können.

Installieren:
gem install Rails_refactor

Stellen Sie vor der Verwendung sicher, dass Sie cd zum Stammverzeichnis Ihres Rails

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 Hilfedatei 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 Anzeigedateien 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 & Klassenname & Tabellennamen in Datei um

...

4
Asme Just

Als Jemand, der gerade diesen schmerzhaften Prozess beendet, ist der MOST wichtig, genug TESTS zu erstellen, um so viele Funktionen wie möglich zu überprüfen. Sie sollten sich nicht nur auf das Modell/Controller beziehen, das Sie umbenennen möchten, sondern auch auf alle anderen Modelle/Controller/Ansichten. Jedenfalls ist es eine gute (oder vielleicht sogar ein Muss) Übung.

Führen Sie diese Schritte durch Wiederholungen aus. Manchmal müssen Sie einige Schritte (5 und mehr) wiederholen, um weitere Dateien zu ermitteln, die geändert werden müssen.

  1. Ändern Sie alle Dateien (Name und Inhalt) des Include Corps/Corp in Stores/Store im Ordner db/migrate
  2. Versuchen zu laufen: 

    rake db: drop: all

    rake db: erstellen

    rake db: migrieren

  3. Inhalt der db/seeds.rb-Datei ändern. 

  4. Führen Sie Folgendes aus: rake db:seed --trace (In diesem Schritt müssen Sie möglicherweise andere Modell-/Controller-Dateien ändern.)
  5. test/fixtures-Dateien ändern. Sie müssen möglicherweise nicht nur corps.yml ändern, sondern auch andere verwandte Dateien (einige Dateien können corp_id enthalten).
  6. Versuchen Sie, Ihre Tests auszuführen, es ist besser, sie mit einem fixierten Startwert auszuführen (fügen Sie hinzu: TESTOPTS="--seed=1981" oder eine andere Zahl).
  7. Umbenennen in Dateien (Name und Inhalt) Achtung! Manchmal müssen Sie die Test- und andere App-Datei ändern 
0
ChaosPredictor

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 der Firma im Controller, Modell, Integration, Fixture Tests.

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

  • route 
  • app/Ansichten
  • app/Controller
  • test/Controller
  • app/Helfer
  • app/assets/javascripts /
  • app/Assets/Stylesheets /

für das Modell ist Nobitas Antwort ziemlich gut

0
Ravi Indorey