Cara mengganti nama pengontrol dan model rel dalam sebuah proyek

93

Saya memulai aplikasi Rails dan semuanya berfungsi dengan baik. Tapi sekarang, saya ingin mengganti nama pengontrol dan model terkait:

Saya ingin mengubah Corpspengontrol menjadi Storesdan sama (tanpa s akhir) untuk model.

Melihat di google, orang menyarankan untuk menghancurkan dan kemudian menghasilkan kembali controller dan model. Masalahnya adalah itu akan menghapus kode sebenarnya dari setiap file!

Ada solusi? Terima kasih sebelumnya.

htaidirt
sumber

Jawaban:

183

Inilah yang akan saya lakukan:

Buat migrasi untuk mengubah nama tabel (level database). Saya berasumsi meja lama Anda disebut korps . Konten migrasi akan menjadi:

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

Ubah nama file model Anda, definisi kelas model Anda dan asosiasi model:

  • Ganti nama file: corp.rb->store.rb
  • Kode dari store.rb: Perubahan class Corpuntukclass Store
  • Ubah nama semua asosiasi model seperti has_many :corps->has_many :stores

Ubah nama file pengontrol Anda dan definisi kelas pengontrol Anda:

  • Ganti nama file: corps_controller.rb->stores_controller.rb
  • Kode dari stores_controller.rb: Perubahan class CorpsControlleruntukclass StoresController

Ubah nama folder tampilan. Dari corpshingga stores.

Buat perubahan yang diperlukan di jalur dalam config/routes.rbfile, seperti resources :corps-> resources :stores, dan pastikan semua referensi dalam kode berubah dari corps ke toko (corps_path, ...)

Ingatlah untuk menjalankan migrasi :)

Jika sebelumnya tidak memungkinkan, coba hapus db / schema.rb dan jalankan:

 $ rake db:drop db:create db:migrate
Nobita
sumber
2
Mungkin ingin menyebutkan untuk mengubah config / routes.rb untuk menunjukkan semua: rute korps ke: menyimpan rute
tgf
1
Saya menjalankan find -name "oldname_on_singular?*untuk mendapatkan daftar file untuk diganti namanya. Lalu saya salin di calc, paste dua kali di kolom kedua dan ketiga. Pada kolom pertama saya tambahkan perintah rename dan pada kolom terakhir saya ganti dengan nama baru, kira-kira seperti:git mv ./spec/views/oldname ./spec/views/new name
Eduardo Santana
Daftar utama tidak ada mengedit file tes dengan model / nama kelas baru, disebutkan oleh @EduardoSantana.
pengguna2953607
rake db:dropsangat berbahaya! Saya akan merekomendasikan Anda menghapus baris ini untuk mengubahnya menjadi "rake db: migrate"! Orang-orang memiliki kecenderungan untuk menyalin dan menjalankan!
Sagar Ranglani
10

Selain jawaban Nobita, Anda juga perlu mengubah definisi kelas test & helper & nama file corpsmenjadi store. Lebih penting lagi Anda harus mengubah corpske storedalam file config / routes.rb Anda

Jadi secara total Anda membuat perubahan pada file Controller, Model, Views, Helpers, Tests dan Routes terkait.

Saya pikir apa yang Anda lihat disarankan dengan destroy& generateadalah pilihan yang lebih baik. Saya telah memberikan jawaban bagaimana melakukan ini di sini: Rails: mengganti nama pengontrol dan model yang sesuai

Holly
sumber
7

Anda juga dapat mencoba permata Rails Refactor , alat baris Perintah untuk refaktor sederhana seperti mengganti nama model dan pengontrol untuk proyek Rails

Pemakaian:

Penggantian nama dan pemfaktoran ulang dasar untuk proyek rel. Meskipun tidak sempurna, mereka melakukan banyak pekerjaan untuk Anda dan menghemat waktu Anda.

Sebelum menggunakan, sebaiknya Anda mulai dari status repositori bersih sehingga Anda dapat meninjau perubahan dengan mudah.

Untuk memasang:
gem install rails_refactor

Sebelum digunakan, pastikan Anda melakukan cd ke root proyek rel Anda.

Untuk mengganti nama pengontrol:
rails_refactor rename OldController NewController

  • ganti nama file pengontrol & nama kelas dalam file
  • mengganti nama file spesifikasi pengontrol & nama kelas dalam file
  • mengganti nama direktori tampilan
  • ganti nama file pembantu & nama modul di file
  • memperbarui rute

Untuk mengganti nama aksi pengontrol:
$ rails_refactor rename DummyController.old_action new_action

  • mengganti nama tindakan pengontrol dalam file kelas pengontrol
  • mengganti nama melihat file untuk semua format

Untuk mengganti nama model:
$ rails_refactor rename OldModel NewModel

  • mengganti nama file model & nama kelas dalam file
  • ganti nama file spesifikasi & nama kelas dalam file
  • ganti nama migrasi & nama kelas & nama tabel dalam file

...

Asme Just
sumber
6

Saya selain jawaban Nobita (yang akan saya komentari jika saya memiliki cukup reputasi), jika Anda merasa berani maka perubahan nama file dan referensi ke model dalam kode Anda dapat diotomatiskan. Misalnya, untuk mengubah referensi dalam kode Anda, Anda dapat menggunakan

Singular, minus dan mayus:

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

Jamak, minus, dan mayus (tunggal ganti jamak jika jamak hanya membutuhkan dan karakter s di akhir):

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

Ganti nama file:

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

Dan ada utilitas bernama rename pada beberapa * nix flavours (termasuk Slackware) yang akan membantu Anda mengganti nama file:

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

Periksa ganti nama adalah apa yang Anda pikirkan, saya telah mengetahui distribusi lain seperti Ubuntu untuk dikirimkan dengan utilitas berbeda dengan nama yang sama (lihat /unix/78621/find-rename-command- tidak bekerja ). Di Ubuntu Anda akan melakukan ini sebagai gantinya:

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

Perhatikan bahwa Anda ingin menghindari mengganti nama file apa pun di db / kecuali mungkin di file seeds.rb Anda, jadi Anda mungkin ingin mengecualikan direktori ini dan membuat perubahan apa pun secara manual.

Dan
sumber
5

Satu hal penting lainnya adalah Anda perlu memperbarui asosiasi model, yang harus Anda lakukan apakah Anda mengganti nama secara manual atau menghancurkan dan menghasilkan sumber daya (karena ada di model lain). Anda dapat menjalankan migrasi untuk mengubah nama kolom dari kunci asing di database dan mengubah semua referensi ke kunci asing tersebut di kode:

rename_column :table, :old_id, :new_id

atau setel kunci asing khusus saat mendeklarasikan asosiasi yang menggunakan kunci asing lama:

belongs_to :new, foreign_key: "old_id"

Selain itu, jika sumber daya Anda menyertakan gambar, gambar tersebut sering kali disimpan dalam direktori yang menyertakan nama sumber daya tetapi (setidaknya dengan gelombang operator) setelah nama sumber daya diubah, mereka akan direferensikan dengan tidak benar (file ada di '/ uploads / old / image / 1 / pic.jpg 'tetapi dicari di' uploads / new / ... '), jadi Anda harus menghapus dan mengupload ulang gambar, memindahkannya ke jalur baru, atau mungkin mengubah tempatnya' sedang dicari.

Pwnrar
sumber
0

Dan jika Anda memiliki uji model, Anda perlu mengubah:

Ganti nama file: corp_test.rb -> store_test.rb (juga untuk uji pengontrol, uji integrasi, fixture, dll.)

Kode store_test.rb: Ubah kelas CorpTest untuk kelas StoreTest.

Dan semua referensi corp di controller, model, integrasi, tes fixture.

Benjamin J. Benoudis
sumber
0

Sebagai seseorang yang baru saja menyelesaikan proses yang menyakitkan ini, langkah PALING penting adalah membuat cukup TEST untuk memeriksa fungsionalitas sebanyak mungkin. Mereka harus mencakup tidak hanya model / pengontrol yang Anda rencanakan untuk diganti namanya tetapi juga semua bagian model / pengontrol / tampilan lainnya. Bagaimanapun itu adalah latihan yang baik (atau mungkin bahkan suatu keharusan).

Lakukan langkah-langkah ini dengan iterasi, terkadang Anda perlu kembali ke langkah beberapa kali (5 dan lebih banyak) untuk menemukan file tambahan yang perlu diubah. Dan sekarang untuk langkah ganti nama:

  1. Ubah semua file (nama dan konten) yang disertakan Corps/Corpke Stores/Storedalam db/migratefolder
  2. Coba jalankan:

    rake db: drop: semua

    rake db: buat

    rake db: bermigrasi

  3. Ubah konten db/seeds.rbfile.

  4. Coba jalankan: rake db:seed --trace(Pada langkah ini Anda mungkin perlu mengubah beberapa file model / pengontrol lainnya.)
  5. Ubah test/fixturesfile. Anda mungkin perlu mengubah tidak hanya corps.yml tetapi file terkait lainnya (beberapa file mungkin menyertakan corp_id).
  6. Cobalah untuk menjalankan tes Anda, lebih baik menjalankannya dengan benih tetap (tambahkan: TESTOPTS="--seed=1981"atau nomor lain)
  7. Ubah nama menjadi file (nama dan konten) hati-hati terkadang Anda perlu mengubah tes dan file aplikasi lainnya
ChaosPredictor
sumber
0

untuk pengontrol Anda harus membuat perubahan di tempat-tempat berikut jika Anda melakukannya secara manual :

  • rute
  • app / views
  • aplikasi / pengontrol
  • tes / pengontrol
  • app / helper
  • app / assets / javascripts /
  • aplikasi / aset / lembar gaya /

untuk model, jawaban Nobita lumayan bagus

Ravi
sumber