Come rinominare il controller e il modello rails in un progetto


91

Ho avviato un'app Rails e tutto funziona bene. Ma ora vorrei rinominare un controller e il modello associato:

Volevo cambiare il Corpscontroller in Storese lo stesso (senza finali) per il modello.

Guardando su google, le persone hanno suggerito di distruggere e quindi generare di nuovo il controller e il modello. Il problema è che cancellerà il codice effettivo di ogni file!

Qualche soluzione? Grazie in anticipo.

Risposte:


181

Ecco cosa farei:

Creare una migrazione per modificare il nome della tabella (a livello di database). Presumo che il tuo vecchio tavolo si chiami corps . Il contenuto della migrazione sarà:

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

Modificare il nome del file del modello, la definizione della classe del modello e le associazioni del modello:

  • Rinomina file: corp.rb->store.rb
  • Codice di store.rb: modifica class Corpperclass Store
  • Rinomina tutte le associazioni del modello come has_many :corps->has_many :stores

Modificare il nome del file del controller e la definizione della classe del controller:

  • Rinomina file: corps_controller.rb->stores_controller.rb
  • Codice di stores_controller.rb: modifica class CorpsControllerperclass StoresController

Rinomina le cartelle delle viste. Dal corpsa stores.

Apporta le modifiche necessarie ai percorsi nel config/routes.rbfile, come resources :corps-> resources :stores, e assicurati che tutti i riferimenti nel codice cambino da corps a stores (corps_path, ...)

Ricordati di eseguire la migrazione :)

Se la precedente non è possibile, prova a eliminare db / schema.rb ed esegui:

 $ rake db:drop db:create db:migrate

2
Potrei menzionare di cambiare config / routes.rb per indirizzare tutte le rotte: corps verso: stores routes
tgf

1
Corro find -name "oldname_on_singular?*per ottenere un elenco di file da rinominare. Poi lo copio su calc, incollo due volte sulla seconda e terza colonna. Nella prima colonna aggiungo il comando rinomina e nell'ultima colonna cambio per il nuovo nome, qualcosa del tipo:git mv ./spec/views/oldname ./spec/views/new name
Eduardo Santana

Manca l'elenco principale modificando i file dei test con il nuovo nome del modello / classe, menzionato da @EduardoSantana.
user2953607

10

Oltre alla risposta Nobita, è necessario modificare analogamente le definizioni delle classi di test e helper e i nomi dei file per corpsa store. Ancora più importante , dovresti cambiare corpsin storenel tuo file config / routes.rb

Quindi in totale stai apportando modifiche al controller, ai file di modello, viste, helper, test e percorsi associati.

Penso che quello che hai visto suggerito con destroy& generatesia un'opzione migliore. Ho dato una risposta su come farlo qui: Rails: rinominare un controller e il modello corrispondente


7

Puoi anche provare Rails Refactor gem, uno strumento a riga di comando per semplici refactoring come rinomina modello e controller per progetti Rails

Utilizzo:

Rinomina e refactoring di base per progetti rails. Anche se non sono perfetti, faranno molto del lavoro per te e ti faranno risparmiare tempo.

Prima di utilizzare, consigliamo di iniziare da uno stato di repository pulito in modo da poter rivedere facilmente le modifiche.

Installare:
gem install rails_refactor

Prima dell'uso, assicurati di aver eseguito il cd nella root del tuo progetto rails.

Per rinominare un controller:
rails_refactor rename OldController NewController

  • rinomina il file del controller e il nome della classe nel file
  • rinomina il file delle specifiche del controller e il nome della classe nel file
  • rinomina la directory di visualizzazione
  • rinomina il file di supporto e il nome del modulo nel file
  • aggiorna le rotte

Per rinominare un'azione del controller:
$ rails_refactor rename DummyController.old_action new_action

  • rinomina l'azione del controller nel file di classe del controller
  • rinomina i file di visualizzazione per tutti i formati

Per rinominare un modello:
$ rails_refactor rename OldModel NewModel

  • rinomina il file del modello e il nome della classe nel file
  • rinomina il file delle specifiche e il nome della classe nel file
  • rinomina la migrazione e il nome della classe e dei nomi delle tabelle nel file

...


6

Oltre alla risposta di Nobita (che commenterei se avessi abbastanza rappresentante), se ti senti coraggioso, le modifiche ai nomi dei file e ai riferimenti al modello nel tuo codice possono essere automatizzate in qualche modo. Ad esempio, per modificare i riferimenti nel codice puoi utilizzare

Singolare, meno e mayus:

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

Plurale, meno e mayus (il singolare sostituisce il plurale se il plurale necessita solo del carattere es alla fine):

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

Rinomina file:

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

E c'è un'utilità chiamata rename su alcune versioni * nix (inclusa Slackware) che ti aiuterà a rinominare i file:

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

Controlla che rinomina sia quello che pensi che sia, ho saputo che altre distribuzioni come Ubuntu vengono fornite con un'utilità diversa con lo stesso nome (vedi /unix/78621/find-rename-command- non funziona ). Su Ubuntu dovresti farlo invece:

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

Nota che vuoi evitare di rinominare qualsiasi file in db / tranne forse nel tuo file seeds.rb, quindi probabilmente vuoi escludere questa directory e apportare modifiche manualmente.


5

Un'altra cosa importante è che devi aggiornare le associazioni del modello, cosa che dovrai fare se rinomini manualmente o se distruggi e generi la risorsa (poiché esistono negli altri modelli). È possibile eseguire una migrazione per modificare i nomi delle colonne delle chiavi esterne nel database e modificare tutti i riferimenti a tali chiavi esterne nel codice:

rename_column :table, :old_id, :new_id

oppure imposta una chiave esterna personalizzata quando dichiari l'associazione che utilizza la vecchia chiave esterna:

belongs_to :new, foreign_key: "old_id"

Inoltre, se la tua risorsa include immagini, queste sono spesso archiviate in una directory che include il nome della risorsa ma (con carrierwave almeno) una volta modificato il nome della risorsa verrà referenziato in modo errato (il file esiste in '/ uploads / old / image / 1 / pic.jpg 'ma viene cercato in' uploads / new / ... '), quindi dovrai eliminare e ricaricare le immagini, spostarle nel nuovo percorso o forse cambiare dove sono' stai cercando.


0

E se disponi di test modello, devi cambiare:

Rinomina file: corp_test.rb -> store_test.rb (anche per test controller, test di integrazione, fixture, ecc.)

Codice di store_test.rb: cambia la classe CorpTest per la classe StoreTest.

E tutti i riferimenti di corp nei test di controller, modello, integrazione, dispositivi.


0

Come qualcuno che ha appena finito questo doloroso processo, il passo PIÙ importante è costruire abbastanza TEST per verificare quante più funzionalità possibili. Dovrebbero riguardare non solo il modello / controller che si intende rinominare, ma anche tutti gli altri modelli / controller / parti di viste. Comunque è una buona (o forse anche un must) pratica.

Eseguire questi passaggi per iterazioni, a volte è necessario tornare ai passaggi alcune volte (5 e più) per scoprire file aggiuntivi che devono essere modificati. E ora per i passaggi di rinomina:

  1. Modificare tutti i file (nome e contenuto) il comprendono Corps/Corpa Stores/Storenella db/migratecartella
  2. Prova a correre:

    rake db: drop: all

    rake db: crea

    rake db: migrate

  3. Cambia il contenuto del db/seeds.rbfile.

  4. Prova a eseguire: rake db:seed --trace(in questo passaggio potresti dover modificare altri file di modello / controller).
  5. Cambia test/fixturesfile. potrebbe essere necessario modificare non solo corps.yml ma altri file correlati (alcuni file possono includere corp_id).
  6. Prova a eseguire i tuoi test, è meglio eseguirlo con seme fisso (aggiungi: TESTOPTS="--seed=1981"o qualsiasi altro numero)
  7. Rinomina in file (nome e contenuto) fai attenzione a volte è necessario modificare il test e altri file dell'app

0

per il controller dovrai apportare modifiche nei seguenti luoghi se lo fai manualmente :

  • itinerario
  • app / visualizzazioni
  • app / controller
  • test / controllori
  • app / aiutante
  • app / assets / javascripts /
  • app / assets / stylesheets /

per il modello, la risposta di Nobita è abbastanza buona

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.