Bir projede ray denetleyicisi ve modeli nasıl yeniden adlandırılır


93

Bir Rails uygulaması başlattım ve her şey yolunda gidiyor. Ama şimdi, bir denetleyiciyi ve ilişkili modeli yeniden adlandırmak istiyorum:

CorpsDenetleyiciyi Storesmodel için ve aynı (son lar olmadan) değiştirmek istedim .

Google'a bakıldığında, insanlar denetleyiciyi ve modeli yok etmeyi ve sonra yeniden oluşturmayı önerdi. Sorun, her dosyanın gerçek kodunu silecek olmasıdır!

Herhangi bir çözüm? Şimdiden teşekkürler.

Yanıtlar:


184

İşte yapacağım şey:

Tablo adını (veritabanı düzeyi) değiştirmek için bir geçiş oluşturun . Sanırım eski masanıza kolordu deniyor . Geçiş içeriği şu şekilde olacaktır:

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

Model dosya adınızı, model sınıf tanımınızı ve model ilişkilendirmelerini değiştirin:

  • Dosyayı yeniden adlandır: corp.rb->store.rb
  • Kod store.rbDeğişikliği: class Corpiçinclass Store
  • Tüm model ilişkilendirmelerini has_many :corps-> gibi yeniden adlandırınhas_many :stores

Denetleyici dosya adınızı ve denetleyici sınıfı tanımınızı değiştirin:

  • Dosyayı yeniden adlandır: corps_controller.rb->stores_controller.rb
  • Kod stores_controller.rbDeğişikliği: class CorpsControlleriçinclass StoresController

Görünümler klasörlerini yeniden adlandırın. Gönderen corpsiçin stores.

config/routes.rbDosyadaki yollarda resources :corps-> gibi gerekli değişiklikleri yapın ve resources :storeskoddaki tüm referansların kolordudan mağazalara (corps_path, ...) değiştiğinden emin olun.

Taşımayı çalıştırmayı unutmayın :)

Önceki mümkün değilse, db / schema.rb dosyasını silmeyi deneyin ve çalıştırın:

 $ rake db:drop db:create db:migrate

2
Tüm: corps rotalarını işaret etmek için config / route.rb'yi değiştirmekten bahsetmek isteyebilirsiniz: rotaları depolar
tgf

1
find -name "oldname_on_singular?*Yeniden adlandırılacak dosyaların bir listesini almak için koşuyorum . Sonra calc üzerine kopyalıyorum, ikinci ve üçüncü sütuna iki kez yapıştırıyorum. İlk sütuna yeniden adlandırma komutunu ekliyorum ve son sütunda yeni adı değiştiriyorum, şöyle bir şey:git mv ./spec/views/oldname ./spec/views/new name
Eduardo Santana

Ana listede, @EduardoSantana tarafından bahsedilen yeni model / sınıf adıyla test dosyalarını düzenleme eksik.
user2953607

1
rake db:dropsüper tehlikeli! Bu satırı kaldırıp "rake db: migrate" olarak değiştirmenizi tavsiye ederim! İnsanlar kopyalayıp yapıştırma ve çalıştırma eğilimindedir!
Sagar Ranglani

10

Nobita cevabına ek olarak, benzer şekilde test ve yardımcı sınıf tanımlarını ve dosya adlarını olarak corpsdeğiştirmeniz gerekir store. Daha da önemlisi değiştirmek gerekir corpsiçin storesizin de config / routes.rb dosyası

Yani toplamda Denetleyici, ilişkili Model, Görünümler, Yardımcıları, Testler ve Yollar dosyalarında değişiklikler yapıyorsunuz.

destroy& İle önerildiğini gördüğünüz şeyin generatedaha iyi bir seçenek olduğunu düşünüyorum. Bunun nasıl yapılacağına burada bir cevap verdim: Rails: bir denetleyiciyi ve karşılık gelen modeli yeniden adlandırma


7

Modeli yeniden adlandırma ve Rails projeleri için denetleyici gibi basit yeniden yapılandırmalar için bir Komut satırı aracı olan Rails Refactor gemini de deneyebilirsiniz.

Kullanım:

Ray projeleri için temel yeniden adlandırmalar ve yeniden düzenlemeler. Bunlar mükemmel olmasa da, sizin için pek çok işi yapacaklar ve size zaman kazandıracaklar.

Kullanmadan önce, değişiklikleri kolayca gözden geçirebilmeniz için temiz bir depo durumundan başlamanızı öneririz.

Yüklemek:
gem install rails_refactor

Kullanmadan önce, rails projenizin kök dizinine yazdığınızdan emin olun .

Bir denetleyiciyi yeniden adlandırmak için:
rails_refactor rename OldController NewController

  • denetleyici dosyasını ve dosyadaki sınıf adını yeniden adlandırır
  • denetleyici özellik dosyasını ve dosyadaki sınıf adını yeniden adlandırır
  • görünüm dizinini yeniden adlandırır
  • dosyadaki yardımcı dosyayı ve modül adını yeniden adlandırır
  • rotaları günceller

Bir denetleyici eylemini yeniden adlandırmak için:
$ rails_refactor rename DummyController.old_action new_action

  • denetleyici sınıfı dosyasında denetleyici eylemini yeniden adlandırır
  • tüm formatlar için görünüm dosyalarını yeniden adlandırır

Bir modeli yeniden adlandırmak için:
$ rails_refactor rename OldModel NewModel

  • dosyadaki model dosyasını ve sınıf adını yeniden adlandırır
  • dosyadaki spec dosyasını ve sınıf adını yeniden adlandırır
  • dosyadaki geçiş & sınıf adı ve tablo adlarını yeniden adlandırır

...


6

Nobita'nın cevabına ek olarak (yeterince temsilcim olsaydı üzerine yorum yapardım), eğer cesur hissediyorsanız, o zaman dosya adlarındaki değişiklikler ve kodunuzdaki modele referanslar bir şekilde otomatikleştirilebilir. Örneğin, kodunuzdaki referansları değiştirmek için kullanabilirsiniz

Tekil, eksi ve mayus:

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

Çoğul, eksi ve mayus (tekil, çoğul ise çoğulu değiştirir ve sonunda s karakteri):

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

Dosyaları yeniden adlandırın:

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

Ve bazı * nix çeşitlerinde (Slackware dahil) dosyaları yeniden adlandırmanıza yardımcı olacak yeniden adlandırma adlı bir yardımcı program vardır:

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

Yeniden adlandırmayı kontrol edin, düşündüğünüz şeydir, Ubuntu gibi aynı adda farklı bir yardımcı programla gönderilen diğer dağıtımları da biliyorum (bkz. Https://unix.stackexchange.com/questions/78621/find-rename-command- çalışmaz ). Ubuntu'da bunun yerine şunu yaparsınız:

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

Muhtemelen seeds.rb dosyanız dışında db / içindeki herhangi bir dosyayı yeniden adlandırmaktan kaçınmak istediğinizi unutmayın, bu nedenle muhtemelen bu dizini dışlamak ve el ile herhangi bir değişiklik yapmak istersiniz.


5

Bir diğer önemli şey de model ilişkilendirmelerini güncellemeniz gerektiğidir, ki bunu ister manuel olarak yeniden adlandırın, ister kaynağı yok edin ve oluşturun (diğer modellerde var oldukları için). Veritabanındaki yabancı anahtarların sütun adlarını değiştirmek ve koddaki bu yabancı anahtarlara yönelik tüm başvuruları değiştirmek için bir geçiş çalıştırabilirsiniz:

rename_column :table, :old_id, :new_id

veya eski yabancı anahtarı kullanan ilişkilendirmeyi bildirirken özel bir yabancı anahtar ayarlayın:

belongs_to :new, foreign_key: "old_id"

Ayrıca, kaynağınız görüntüler içeriyorsa, bunlar genellikle kaynak adını içeren bir dizinde depolanır, ancak (en azından carrierwave ile) kaynağın adı değiştirildiğinde yanlış bir şekilde referans alınır (dosya '/ uploads / old / image / 1 / pic.jpg 'ancak' yüklemeler / yeni / ... 'aranır), bu nedenle resimleri silmeniz ve yeniden yüklemeniz, yeni yola taşımanız veya belki de yerlerini değiştirmeniz gerekir. yeniden aranıyor.


0

Ve model testleriniz varsa, değiştirmeniz gerekir:

Dosyanın yeniden adlandırılması: corp_test.rb -> store_test.rb (ayrıca kontrolör testleri, entegrasyon testleri, fikstür vb. İçin)

Store_test.rb kodu: StoreTest sınıfı için CorpTest sınıfını değiştirin.

Ve denetleyici, model, entegrasyon, fikstür testlerinde corp'un tüm referansları.


0

Bu acı verici süreci yeni bitiren biri olarak EN önemli adım, mümkün olduğunca fazla işlevselliği kontrol etmek için yeterli TEST oluşturmaktır . Yalnızca yeniden adlandırmayı planladığınız modeli / denetleyiciyi değil, diğer tüm modelleri / denetleyicileri / görünüm parçalarını da kapsamalıdır. Her neyse, bu iyi (veya belki de bir zorunluluktur) pratiktir.

Bu adımları yinelemelerle yapın, bazen değiştirilmesi gereken ek dosyaları keşfetmek için birkaç kez (5 ve daha fazla) adımlara geri dönmeniz gerekir. Ve şimdi yeniden adlandırma adımları için:

  1. Dahil tüm dosyaları (isim ve içerik) değiştirin Corps/Corpiçin Stores/Storede db/migrateklasörüne
  2. Çalıştırmayı deneyin:

    rake db: drop: tümü

    komisyon db: oluştur

    komisyon db: geçiş

  3. db/seeds.rbDosyanın içeriğini değiştirin .

  4. Çalıştırmayı deneyin: rake db:seed --trace(Bu adımda diğer bazı model / kontrolör dosyalarını değiştirmeniz gerekebilir.)
  5. test/fixturesDosyaları değiştirin . yalnızca corps.yml'yi değil, diğer ilgili dosyaları da değiştirmeniz gerekebilir (bazı dosyalar corp_id içerebilir).
  6. Testlerinizi çalıştırmayı deneyin, sabit tohumla çalıştırmak daha iyidir (ekleyin: TESTOPTS="--seed=1981"veya başka bir sayı)
  7. Dosyalara yeniden adlandırın (ad ve içerik) dikkatli olun, bazen testi ve diğer uygulama dosyalarını değiştirmeniz gerekir

0

Kontrol cihazı için, manuel olarak yapıyorsanız aşağıdaki yerlerde değişiklik yapmanız gerekecektir :

  • rota
  • uygulama / görünümler
  • uygulama / denetleyiciler
  • test / kontrolörler
  • uygulama / yardımcı
  • uygulama / varlıklar / javascripts /
  • uygulama / varlıklar / stil sayfaları /

model için Nobita'nın cevabı oldukça iyi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.