Jak zmienić nazwę kontrolera i modelu rails w projekcie

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ć kontroler Corps Na Stores i ten sam (bez końcowych s) dla modelu.

Patrząc na google, ludzie zasugerowali, aby zniszczyć, a następnie wygenerować ponownie kontroler i model. Problem polega na tym, że usunie rzeczywisty kod KAŻDEGO pliku!

Jakieś rozwiązanie? Z góry dzięki.
Author: Rick Smith, 2012-08-12

8 answers

Oto co bym zrobił:

Utwórz migrację w celu zmiany nazwy tabeli (poziomu bazy danych). Zakładam, że Twój stary stół nazywa się corps. Zawartość migracji będzie wynosić:

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: Zmień class Corp na class Store
  • Zmień nazwę wszystkich asocjacji modeli jak has_many :corps - > has_many :stores

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

  • zmiana nazwy pliku: corps_controller.rb -> stores_controller.rb
  • kod z stores_controller.rb: Zmień class CorpsController na class StoresController

Zmień nazwę folderów widoków. Od corps do stores.

Wprowadzić niezbędne zmiany w ścieżkach w pliku config/routes.rb, Jak resources :corps -> resources :stores, i upewnij się, że wszystkie odniesienia w kodzie zmienią się z corps na stores (corps_path, ...)

Pamiętaj, aby uruchomić migrację :)

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

 $ rake db:drop db:create db:migrate
 160
Author: Nobita,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-21 23:02:27

Oprócz odpowiedzi Nobita należy również zmienić test & helper definicje klas i nazwy plików dla corps do store. ważniejsze należy zmienić corps na storew swoim Config/routes.RB plik

Więc w sumie wprowadzasz zmiany do kontrolera, powiązanego modelu, widoków, Helperów, testów i plików tras.

Myślę, że to, co widziałeś sugerowało z destroy & generate to lepsza opcja. Dałem odpowiedź jak to zrobić to tutaj: Rails: zmiana nazwy kontrolera i odpowiadającego mu Modelu

 9
Author: Holly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:51

Dodam do odpowiedzi Nobity (którą bym skomentował, gdybym miał dość rep), jeśli czujesz się odważny, to zmiany nazw plików i odniesień do modelu w Twoim kodzie mogą być nieco zautomatyzowane. Na przykład, aby zmienić odniesienia w kodzie możesz użyć

Liczba pojedyncza, minus i majus:

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

Liczba mnoga, minus i mayus (liczba pojedyncza zastąp liczbę mnogą, jeśli liczba mnoga potrzebuje tylko i Znak s 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}' {} \;

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

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

Sprawdź Zmień nazwę jest tym, co myślisz, że jest, ale znam inne dystrybucje, takie jak Ubuntu, aby wysyłać z innym narzędziem o tej samej nazwie (zobacz https://unix.stackexchange.com/questions/78621/find-rename-command-doesnt-work). na Ubuntu zrobiłbyś to zamiast:

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

Zauważ, że chcesz uniknąć zmiany nazw plików w db / z wyjątkiem prawdopodobnie w Twoim nasiona.plik rb, więc prawdopodobnie chcesz wykluczyć ten katalog i dokonać żadnych zmian ręcznie.

 6
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:36:24

Inną ważną rzeczą jest to, że musisz zaktualizować Asocjacje modeli, co musisz zrobić, niezależnie od tego, czy zmienisz nazwę ręcznie, czy zniszczysz i wygenerujesz 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 ustawić niestandardowy klucz obcy podczas deklarowania związku, który używa starego obcego klucz:

belongs_to :new, foreign_key: "old_id"

Również jeśli Twój zasób zawiera obrazy, są one często przechowywane w katalogu, który zawiera nazwę zasobu, ale (przynajmniej z funkcją carrierwave) po zmianie nazwy zasobu będą one błędnie odwoływane (plik istnieje w '/uploads/old/image/1/pic.jpg 'ale szuka się' uploads / new/...'), więc będziesz musiał albo usunąć i ponownie przesłać obrazy, przenieść je na nową ścieżkę, albo może zmienić miejsce, w którym są szukane.

 5
Author: Pwnrar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-19 07:08:53

Możesz również wypróbować Rails Refactor gem, narzędzie wiersza poleceń do prostych refaktorów, takich jak rename model i kontroler dla projektów Rails

Użycie:

Podstawowe zmiany nazw i refaktoringi dla projektów rails. Chociaż są to nie są idealne, wykonają dużo pracy dla Ciebie i zaoszczędzą czas.

Przed użyciem zalecamy rozpoczęcie od czystego stanu repozytorium możesz więc łatwo przeglądać zmiany.

To zainstaluj:
gem install rails_refactor

Przed Użyciem upewnij się, że cd do katalogu głównego twojego projektu rails.

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
  • aktualizacje tras

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 widoków 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 spec i nazwę klasy w pliku
  • zmienia nazwy migracji i nazwy klas i nazw tabel w pliku

...

 4
Author: Asme Just,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-05 17:54:07

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

Nazwa pliku: corp_test.rb - > store_test.rb (również do testów sterowników, testów integracyjnych, osprzętu itp.)

Kod store_test.rb: Zmiana klasy CorpTest dla klasy StoreTest.

I wszystkie odniesienia corp w sterowniku, modelu, integracji, testach osprzętu.

 0
Author: Benjamin J. Benoudis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-19 08:55:37

Jako ktoś, 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óry planujesz zmienić nazwę, ale także wszystkie inne części modeli/kontrolerów / widoków. W każdym razie jest to dobra (a może nawet konieczność) praktyka.

Wykonaj to krok po kroku, czasami musisz wrócić do kroków kilka razy (5 i więcej), aby odkryć dodatkowe pliki, które wymagają zmiany. Oraz teraz kroki zmiany nazwy:

  1. zmień wszystkie pliki (nazwę i zawartość) Dołącz Corps/Corp na Stores/Store w folderze db/migrate
  2. Spróbuj uruchomić:

    Rake db: drop: all

    Rake db: create

    Rake db: migrate

  3. Zmień zawartość pliku db/seeds.rb.

  4. spróbuj uruchomić: rake db:seed --trace (w tym kroku może być konieczna zmiana innych plików modelu / kontrolera.)
  5. Zmień test/fixtures Pliki. może trzeba zmienić nie tylko korpus.yml ale inne pliki powiązane (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ć plik test i inne aplikacje
 0
Author: ChaosPredictor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-05 11:23:02

Dla kontrolera będziesz musiał dokonać zmiany w następujących miejscach, jeśli robisz to Ręcznie:

  • trasa
  • app / views
  • app / controllers
  • test / Kontrolery
  • app / helper
  • app / assets/javascripts /
  • app / assets / stylesheets /

Dla modelki odpowiedź Nobity jest całkiem dobra

 0
Author: Ravi Indorey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-09 15:27:11