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.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
naclass 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
naclass 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
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 store
w 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
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.
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.
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
...
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.
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:
- zmień wszystkie pliki (nazwę i zawartość) Dołącz
Corps/Corp
naStores/Store
w folderzedb/migrate
-
Spróbuj uruchomić:
Rake db: drop: all
Rake db: create
Rake db: migrate
Zmień zawartość pliku
db/seeds.rb
.- spróbuj uruchomić:
rake db:seed --trace
(w tym kroku może być konieczna zmiana innych plików modelu / kontrolera.) - Zmień
test/fixtures
Pliki. może trzeba zmienić nie tylko korpus.yml ale inne pliki powiązane (niektóre pliki mogą zawierać corp_id). - spróbuj uruchomić testy, lepiej uruchomić je ze stałym ziarnem (dodaj:
TESTOPTS="--seed=1981"
lub dowolną inną liczbę) - Zmień nazwę na pliki (nazwa i zawartość) bądź ostrożny czasami musisz zmienić plik test i inne aplikacje
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
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