Как переименовать контроллер и модель рельсов в проект
Я запустил приложение Rails, и все работает отлично. Но теперь я хотел бы переименовать контроллер и связанную с ним модель:
Я хотел изменить контроллер Corps
на Stores
и тот же (без окончательного s) для модели.
Глядя на google, люди предложили уничтожить, а затем снова создать контроллер и модель. Проблема в том, что он удалит фактический код каждого файла!
Любое решение? Спасибо заранее.
Ответы
Ответ 1
Вот что я сделал бы:
Создайте перенос, чтобы изменить имя таблицы (уровень базы данных). Я предполагаю, что ваш старый стол называется корпусом. Содержимое миграции будет:
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_path,...)
Не забудьте выполнить миграцию:)
Если предыдущий невозможен, попробуйте удалить db/schema.rb и выполните:
$ rake db:drop db:create db:migrate
Ответ 2
В дополнение к ответам Nobita вам также необходимо изменить определения класса test и помощника и имена файлов для corps
до store
. Более важно вам следует изменить corps
на store
в файле config/routes.rb
Таким образом, вы вносите изменения в файлы Controller, связанные с Model, Views, Helpers, Tests and Routes.
Я думаю, что лучшее, что вы видели, предлагаемое с destroy
и generate
. Ive дал ответ, как это сделать здесь: Rails: переименование элемента управления и соответствующей модели
Ответ 3
Я добавлю к ответу Nobita (который я бы прокомментировал, если бы у меня было достаточно репутации), если вы чувствуете себя храбрым, изменения в именах файлов и ссылки на модель в вашем коде могут быть несколько автоматизированы. Например, чтобы изменить ссылки в коде, вы можете использовать
Сингулярный, минус и майус:
grep -rl corp | xargs sed -i 's/corp/store/g'
grep -rl Corp | xargs sed -i 's/Corp/Store/g'
Плюс, минус и майюс (сингулярно заменяют множественное число, если только множественное число потребностей и символ s в конце):
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-doesnt-work). На Ubuntu вы сделаете это вместо этого:
shopt -s globstar
rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps*
Обратите внимание, что вы хотите избежать переименования любых файлов в db/except, возможно, в файле seeds.rb, поэтому вы, вероятно, захотите исключить этот каталог и внести какие-либо изменения вручную.
Ответ 4
Еще одна важная вещь заключается в том, что вам необходимо обновить ассоциации моделей, которые вам придется выполнять, переименовывая вручную или уничтожая и генерируя ресурс (поскольку они существуют в других моделях). Вы можете выполнить миграцию, чтобы изменить имена столбцов внешних ключей в базе данных и изменить все ссылки на эти внешние ключи в коде:
rename_column :table, :old_id, :new_id
или установить пользовательский внешний ключ при объявлении ассоциации, которая использует старый внешний ключ:
belongs_to :new, foreign_key: "old_id"
Кроме того, если ваш ресурс включает в себя изображения, они часто хранятся в каталоге, который содержит имя ресурса, но (с несущей волной), как только имя ресурса будет изменено, они будут неправильно указаны (файл существует в '/uploads/old/image/1/pic.jpg ', но просматривается в' uploads/new/... '), поэтому вам придется либо удалить и повторно загрузить изображения, переместить их на новый путь, либо, возможно, изменить где их ищут.
Ответ 5
И если у вас есть модельные тесты, вам нужно изменить:
Переименование файлов: corp_test.rb → store_test.rb(также для тестов контроллеров, тестов интеграции, привязки и т.д.)
Код store_test.rb: измените класс CorpTest для класса StoreTest.
И все ссылки на corp в контроллере, модели, интеграции, тестах fixture.
Ответ 6
Как кто-то, кто только завершит этот болезненный процесс, самым важным шагом является создание достаточно TESTS, чтобы проверить как можно больше функциональности. Они должны охватывать не только модель/контроллер, который вы планируете переименовать, но и все другие модели/контроллеры/части обзора. В любом случае это хорошая (или, может быть, даже обязательная) практика.
Выполняйте эти шаги с помощью итераций, иногда вам нужно вернуться к шагам несколько раз (5 и более), чтобы обнаружить дополнительные файлы, которые необходимо изменить.
И теперь для шагов переименования:
Ответ 7
для контроллера вам нужно будет внести изменения в следующие места, если вы делаете это вручную:
- маршрут
- приложение/просмотров
- приложение/контроллеры
- тест/контроллеры
- приложение/помощник
- приложение/активы/JavaScripts/
- приложение/активы/таблицы стилей /
для модели, ответ Nobita довольно хорош
Ответ 8
Вы можете попробовать Rails Refactor, это инструмент командной строки для простых рефакторов, таких как модель переименования и контроллер для проектов Rails
Применение:
Основные переименования и рефакторинг для проектов рельсов. Хотя это не идеально, они сделают для вас много работы и сэкономят ваше время.
Перед использованием рекомендуем вам начать с состояния чистого хранилища поэтому вы можете легко просмотреть изменения.
Для установки:
gem install rails_refactor
Перед использованием убедитесь, что вы cd в корневой каталог вашего проекта рельсов.
Чтобы переименовать контроллер:
rails_refactor rename OldController NewController
- переименовывает файл контроллера и имя класса в файле
- переименовывает файл спецификации контроллера и имя класса в файле
- переименовать каталог просмотра
- переименовывает вспомогательный файл и имя модуля в файле
- обновляет маршруты
Чтобы переименовать действие контроллера:
$ rails_refactor rename DummyController.old_action new_action
- переименовывает действие контроллера в файле класса контроллера
- переименовывает файлы просмотра для всех форматов.
Чтобы переименовать модель:
$ rails_refactor rename OldModel NewModel
- переименовывает файл модели и имя класса в файле
- переименовывает spec файл и имя класса в файле
- переименовывает имя миграции и имя класса и имена таблиц в файле
...