Jak zmienić nazwę kontrolera i modelu szyn w projekcie

93

Uruchomiłem aplikację Rails i wszystko działa dobrze. Ale teraz chciałbym zmienić nazwę kontrolera i związanego z nim modelu:

Chciałem zmienić Corpskontroler na Storesi to samo (bez końcówek) dla modelu.

Szukając go w Google, ludzie zasugerowali zniszczenie i ponowne wygenerowanie kontrolera i modelu. Problem w tym, że usunie rzeczywisty kod każdego pliku!

Jakieś rozwiązanie? Z góry dziękuję.

htaidirt
źródło

Odpowiedzi:

183

Oto, co bym zrobił:

Utwórz migrację, aby zmienić nazwę tabeli (poziom bazy danych). Zakładam, że twój stary stół nazywa się korpusem . Zawartość migracji będzie:

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

Zmień nazwę pliku modelu, definicję klasy modelu i skojarzenia modelu:

  • Zmiana nazwy pliku: corp.rb->store.rb
  • Kod store.rb: Zmiana class Corpdlaclass Store
  • Zmień nazwę wszystkich skojarzeń modelu, na przykład has_many :corps->has_many :stores

Zmień nazwę pliku kontrolera i definicję klasy kontrolera:

  • Zmiana nazwy pliku: corps_controller.rb->stores_controller.rb
  • Kod stores_controller.rb: Zmiana class CorpsControllerdlaclass StoresController

Zmień nazwy folderów widoków. Od corpsdo stores.

Wprowadź niezbędne zmiany w ścieżkach w config/routes.rbpliku, takich jak resources :corps-> resources :stores, i upewnij się, że wszystkie odniesienia w kodzie zmieniają się z korpusu na sklepy (ścieżka_korpusu, ...)

Pamiętaj, aby przeprowadzić migrację :)

Jeśli poprzednie nie jest możliwe, spróbuj usunąć plik db / schema.rb i wykonaj:

 $ rake db:drop db:create db:migrate
Nobita
źródło
2
Może chciałbym wspomnieć o zmianie config / tours.rb, aby wskazywał wszystkie: corps Routes na: przechowuje trasy
tgf
1
Biegnę, find -name "oldname_on_singular?*aby uzyskać listę plików do zmiany nazwy. Następnie kopiuję go na kalk, wklejam dwa razy w drugiej i trzeciej kolumnie. W pierwszej kolumnie dodaję komendę rename a na ostatniej zmieniam na nową nazwę, coś w stylu:git mv ./spec/views/oldname ./spec/views/new name
Eduardo Santana
Na głównej liście brakuje edycji plików testów z nową nazwą modelu / klasy, o której wspomniał @EduardoSantana.
user2953607
rake db:dropjest super niebezpieczny! Zalecałbym usunięcie tej linii, aby zmienić ją na „rake db: migrate”! Ludzie mają tendencję do kopiowania-wklejania i uruchamiania!
Sagar Ranglani
10

Oprócz odpowiedzi Nobita, podobnie musisz zmienić definicje klas testowych i pomocniczych oraz nazwy plików dla corpsna store. Co ważniejsze powinno zmienić corpssię storew config / routes.rb pliku

W sumie więc wprowadzasz zmiany w kontrolerze, skojarzonym modelu, widokach, pomocnikach, testach i plikach tras.

Myślę, że to, co widziałeś, zasugerowało destroyi generatejest lepszą opcją. Podałem tutaj odpowiedź, jak to zrobić: Rails: zmiana nazwy kontrolera i odpowiedniego modelu

Ostrokrzew
źródło
7

Możesz także wypróbować klejnot Rails Refactor , narzędzie wiersza poleceń do prostych refaktorów, takich jak zmiana nazwy modelu i kontroler dla projektów Rails

Stosowanie:

Podstawowe przemianowania i refaktoryzacje projektów szynowych. Chociaż nie są one doskonałe, wykonają za Ciebie dużo pracy i zaoszczędzą czas.

Przed użyciem zalecamy rozpoczęcie od czystego stanu repozytorium, aby można było łatwo przeglądać zmiany.

Żeby zainstalować:
gem install rails_refactor

Przed użyciem upewnij się, że wykonałeś cd do katalogu głównego projektu railsowego.

Aby zmienić nazwę kontrolera:
rails_refactor rename OldController NewController

  • zmienia nazwę pliku kontrolera i nazwę klasy w pliku
  • zmienia nazwę pliku specyfikacji kontrolera i nazwę klasy w pliku
  • zmienia nazwę katalogu widoku
  • zmienia nazwę pliku pomocniczego i nazwę modułu w pliku
  • aktualizuje trasy

Aby zmienić nazwę akcji kontrolera:
$ rails_refactor rename DummyController.old_action new_action

  • zmienia nazwę akcji kontrolera w pliku klasy kontrolera
  • zmienia nazwy plików widoku dla wszystkich formatów

Aby zmienić nazwę modelu:
$ rails_refactor rename OldModel NewModel

  • zmienia nazwę pliku modelu i nazwę klasy w pliku
  • zmienia nazwę pliku specyfikacji i nazwę klasy w pliku
  • zmienia nazwy migracji i nazwy klas oraz nazwy tabel w pliku

...

Asme Just
źródło
6

Oprócz odpowiedzi Nobity (którą skomentowałbym, gdybym miał wystarczającą liczbę powtórzeń), jeśli czujesz się odważny, zmiany nazw plików i odniesień do modelu w twoim kodzie mogą być nieco zautomatyzowane. Na przykład, aby zmienić odwołania w swoim kodzie, możesz użyć

Liczba pojedyncza, minus i mayus:

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

Liczba mnoga, minus i majus (liczba pojedyncza zamień liczbę mnogą, jeśli liczba mnoga wymaga tylko i znaku na końcu):

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

Zmień nazwy plików:

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

W niektórych wersjach * nix (w tym w Slackware) jest narzędzie o nazwie rename, które pomoże ci zmienić nazwy plików:

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

Sprawdź, czy zmiana nazwy jest tym, czym myślisz, ale znam inne dystrybucje, takie jak Ubuntu, że są dostarczane z innym narzędziem o tej samej nazwie (patrz /unix/78621/find-rename-command- nie działa ). W systemie Ubuntu zrobiłbyś to zamiast tego:

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

Zwróć uwagę, że chcesz uniknąć zmiany nazw plików w db / z wyjątkiem prawdopodobnie pliku seeds.rb, więc prawdopodobnie chcesz wykluczyć ten katalog i wprowadzić zmiany ręcznie.

Dan
źródło
5

Inną ważną rzeczą jest to, że musisz zaktualizować powiązania modelu, co musisz zrobić, niezależnie od tego, czy zmieniasz nazwę ręcznie, czy też niszczysz i generujesz zasób (ponieważ istnieją one w innych modelach). Możesz albo uruchomić migrację, aby zmienić nazwy kolumn kluczy obcych w bazie danych i zmienić wszystkie odniesienia do tych kluczy obcych w kodzie:

rename_column :table, :old_id, :new_id

lub ustaw niestandardowy klucz obcy podczas deklarowania asocjacji używającej starego klucza obcego:

belongs_to :new, foreign_key: "old_id"

Ponadto, jeśli zasób zawiera obrazy, często są one przechowywane w katalogu zawierającym nazwę zasobu, ale (przynajmniej z falą nośną), gdy nazwa zasobu zostanie zmieniona, będą się do nich odwoływać nieprawidłowo (plik istnieje w '/ uploads / old / image / 1 / pic.jpg ', ale jest szukany w' uploads / new / ... '), więc będziesz musiał albo usunąć i ponownie przesłać obrazy, przenieść je na nową ścieżkę lub może zmienić miejsce, w którym się znajdują' są szukani.

Pwnrar
źródło
0

A jeśli masz testy modelowe, musisz zmienić:

Zmiana nazwy pliku: corp_test.rb -> store_test.rb (również do testów kontrolera, testów integracji, fixture itp.)

Kod store_test.rb: Zmień klasę CorpTest na klasę StoreTest.

I wszystkie referencje firmy w kontrolerze, modelu, integracji, testach urządzeń.

Benjamin J. Benoudis
źródło
0

Dla kogoś, kto właśnie kończy ten bolesny proces, NAJWAŻNIEJSZYM krokiem jest zbudowanie wystarczającej liczby TESTÓW, aby sprawdzić jak najwięcej funkcjonalności. Powinny one obejmować nie tylko model / kontroler, którego nazwę planujesz zmienić, ale także wszystkie inne modele / kontrolery / widoki części. W każdym razie to dobra (a może wręcz obowiązkowa) praktyka.

Wykonuj te kroki iteracyjnie, czasami musisz wrócić do kroków kilka razy (5 i więcej), aby odkryć dodatkowe pliki, które należy zmienić. A teraz etapy zmiany nazwy:

  1. Zmień wszystkie pliki (nazwy i treści) include Corps/Corpsię Stores/Storew db/migratefolderze
  2. Spróbuj biec:

    rake db: drop: all

    rake db: create

    rake db: migracja

  3. Zmień zawartość db/seeds.rbpliku.

  4. Spróbuj uruchomić: rake db:seed --trace(w tym kroku może być konieczna zmiana innych plików modelu / kontrolera).
  5. Zmień test/fixturespliki. może zajść potrzeba zmiany nie tylko pliku corps.yml, ale także innych powiązanych plików (niektóre pliki mogą zawierać corp_id).
  6. Spróbuj uruchomić testy, lepiej uruchomić je ze stałym ziarnem (dodaj: TESTOPTS="--seed=1981"lub dowolną inną liczbę)
  7. Zmień nazwę na pliki (nazwa i zawartość) bądź ostrożny, czasami musisz zmienić test i inny plik aplikacji
ChaosPredictor
źródło
0

dla kontrolera będziesz musiał dokonać zmian w następujących miejscach, jeśli robisz to ręcznie :

  • trasa
  • app / views
  • aplikacja / kontrolery
  • test / kontrolery
  • app / helper
  • aplikacja / zasoby / javascripts /
  • aplikacja / zasoby / arkusze stylów /

jeśli chodzi o model, odpowiedź Nobity jest całkiem dobra

Ravi
źródło