Як перейменувати контролер та модель рейок у проекті


92

Я запустив додаток Rails, і все працює нормально. Але зараз я хотів би перейменувати контролер та відповідну модель:

Я хотів змінити Corpsконтролер на Storesтой самий (без остаточних s) для моделі.

Дивлячись на google, люди пропонували знищити, а потім знову генерувати контролер і модель. Проблема в тому, що це призведе до стирання фактичного коду кожного файлу!

Будь-яке рішення? Заздалегідь спасибі.

Відповіді:


182

Ось що я б зробив:

Створіть міграцію для зміни назви таблиці (рівень бази даних). Я припускаю, що ваш старий стіл називається корпусом . Вміст міграції буде:

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

Змініть ім'я файлу моделі, визначення класу моделі та асоціації моделей:

  • Перейменування файлу: corp.rb->store.rb
  • Код store.rb: Змінити class Corpнаclass Store
  • Перейменуйте всі асоціації моделей, наприклад has_many :corps->has_many :stores

Змініть ім'я файлу контролера та визначення класу контролера:

  • Перейменування файлу: corps_controller.rb->stores_controller.rb
  • Код stores_controller.rb: Змінити class CorpsControllerнаclass StoresController

Перейменувати папки переглядів. Від corpsдо stores.

Внесіть необхідні зміни у шляхи у config/routes.rbфайлі, наприклад resources :corps-> resources :stores, і переконайтеся, що всі посилання в коді змінюються з corps на store (corps_path, ...)

Не забудьте запустити міграцію :)

Якщо попереднє неможливо, спробуйте видалити db / schema.rb і виконати:

 $ rake db:drop db:create db:migrate

2
Можливо, варто згадати про зміну config / routes.rb, щоб вказати всі маршрути: corps на:
store

1
Я біжу, find -name "oldname_on_singular?*щоб отримати список файлів для перейменування. Потім я копіюю його на calc, вставляю два рази на другий і третій стовпець. У першому стовпці я додаю команду перейменувати, а в останньому стовпчику замінюю нове ім'я, щось на зразок:git mv ./spec/views/oldname ./spec/views/new name
Едуардо Сантана

У основному списку відсутнє редагування файлів тестів з новою назвою моделі / класу, згаданих @EduardoSantana.
user2953607

rake db:dropсупер небезпечно! Я б порекомендував вам видалити цей рядок, щоб змінити його на "rake db: migrate"! Люди мають тенденцію копіювати та вставляти та запускати!
Сагар Ранглані,

10

На додаток до відповіді Nobita, аналогічним чином потрібно змінити визначення тесту та допоміжного класу та назви файлів corpsна store. Що ще більш важливо, вам слід змінити corpsна storeу вашому файлі config / routes.rb

Отже, загалом ви вносите зміни до файлів контролера, пов’язаної моделі, подань, помічників, тестів та маршрутів.

Я думаю, що те, що ви бачили, пропонується з destroy& generate- кращий варіант. Я дав відповідь, як це зробити тут: Rails: перейменування контролера та відповідної моделі


7

Ви також можете спробувати дорогоцінний камінь Rails Refactor , інструмент командного рядка для простих рефакторів, таких як модель перейменування та контролер для проектів Rails

Використання:

Основні перейменування та рефакторинг проектів рейок. Хоча вони не ідеальні, вони зроблять за вас велику роботу та заощадять ваш час.

Перед використанням рекомендуємо починати з чистого стану сховища, щоб ви могли легко переглянути зміни.

Щоб встановити:
gem install rails_refactor

Перед використанням переконайтеся, що ви записали компакт-диск у корінь вашого проекту reils.

Щоб перейменувати контролер:
rails_refactor rename OldController NewController

  • перейменовує файл файлу контролера та ім'я класу у файлі
  • перейменовує специфікаційний файл контролера та ім'я класу у файлі
  • перейменовує каталог перегляду -
  • перейменовує довідковий файл та ім'я модуля у файлі
  • оновлення маршрутів

Щоб перейменувати дію контролера:
$ rails_refactor rename DummyController.old_action new_action

  • перейменовує дію контролера у файлі класу контролера
  • перейменовує файли перегляду для всіх форматів

Щоб перейменувати модель:
$ rails_refactor rename OldModel NewModel

  • перейменовує файл моделі та ім'я класу у файлі
  • перейменовує файл специфікації та ім'я класу у файлі
  • перейменовує міграцію та ім'я класу та назви таблиць у файлі

...


6

На додаток до відповіді Нобіти (яку я б прокоментував, якби у мене було достатньо представників), якщо ви почуваєтесь сміливо, тоді зміни в іменах файлів та посиланнях на модель у вашому коді можуть бути дещо автоматизовані. Наприклад, для зміни посилань у коді ви можете використовувати

Одиночний, мінус та майус:

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

Множина, мінус та майус (однина замінює множину, якщо множині потрібні лише символ і символ в кінці):

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

Перейменувати файли:

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

І існує утиліта під назвою rename (перейменування) для деяких ароматів * nix (включаючи Slackware), яка допоможе вам перейменувати файли:

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

Перевірка перейменування - це те, що, на вашу думку, є, я знав, що інші дистрибутиви, такі як Ubuntu, постачаються з іншою утилітою з тим самим іменем (див. Https://unix.stackexchange.com/questions/78621/find-rename-command- не працює ). На Ubuntu ви б зробили це замість цього:

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

Зауважте, що ви хочете уникати перейменування будь-яких файлів у db / за винятком можливо у вашому файлі seed.rb, тому ви, мабуть, хочете виключити цей каталог та внести будь-які зміни вручну.


5

Інша важлива річ полягає в тому, що вам потрібно оновити асоціації моделей, які вам доведеться робити, перейменовуючи вручну або знищуючи та створюючи ресурс (оскільки вони існують в інших моделях). Ви можете запустити міграцію, щоб змінити імена стовпців зовнішніх ключів у базі даних і змінити всі посилання на ці зовнішні ключі в коді:

rename_column :table, :old_id, :new_id

або встановіть власний зовнішній ключ при оголошенні асоціації, яка використовує старий зовнішній ключ:

belongs_to :new, foreign_key: "old_id"

Крім того, якщо ваш ресурс включає зображення, вони часто зберігаються в каталозі, що включає ім'я ресурсу, але (принаймні з несучою хвилею) після зміни імені ресурсу на них буде вказано неправильне посилання (файл існує за адресою '/ uploads / old / image / 1 / pic.jpg ', але шукається у' uploads / new / ... '), тому вам доведеться або видалити, і повторно завантажити зображення, перенести їх на новий шлях або, можливо, змінити, де вони' шукають.


0

І якщо у вас є тести моделей, вам потрібно змінити:

Перейменування файлу: corp_test.rb -> store_test.rb (також для тестів контролерів, тестів інтеграції, кріплення тощо)

Код store_test.rb: Змінити клас CorpTest на клас StoreTest.

І всі посилання на corp у контролері, моделі, інтеграції, тестах кріплення.


0

Як хтось, хто просто закінчив цей болючий процес, НАЙГОЛОВНІШИМ кроком є ​​створення достатньої кількості ТЕСТІВ, щоб перевірити якомога більше функціональних можливостей. Вони повинні охоплювати не тільки модель / контролер, яку ви плануєте перейменувати, але й усі інші частини моделей / контролерів / видів. У будь-якому випадку це хороша (або, можливо, навіть обов’язкова) практика.

Робіть це кроками за допомогою ітерацій, іноді вам потрібно повернутися до кроків кілька разів (5 і більше), щоб виявити додаткові файли, які потрібно змінити. А тепер для кроків перейменування:

  1. Змінити все файли (ім'я та вміст) включають Corps/Corpв Stores/Storeв db/migrateпапці
  2. Спробуйте запустити:

    граблі db: drop: all

    rake db: create

    rake db: мігрувати

  3. Змінити вміст db/seeds.rbфайлу.

  4. Спробуйте запустити: rake db:seed --trace(На цьому кроці вам може знадобитися змінити деякі інші файли моделі / контролера.)
  5. Змінити test/fixturesфайли. можливо, вам доведеться змінити не тільки corps.yml, але й інші пов’язані файли (деякі файли можуть містити corp_id).
  6. Спробуйте запустити тести, краще запускати його з фіксованим насінням (додати: TESTOPTS="--seed=1981"або будь-яке інше число)
  7. Перейменуйте файли (ім’я та вміст) будьте обережні, іноді вам потрібно змінити файл тесту та інший додаток

0

для контролера вам доведеться робити зміни в наступних місцях, якщо ви робите це вручну :

  • маршруту
  • додаток / перегляди
  • додаток / контролери
  • тест / контролери
  • додаток / помічник
  • app / assets / javascripts /
  • додаток / активи / таблиці стилів /

для моделі відповідь Нобіти досить гарна

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.