Как переименовать контроллер и модель рельсов в проект

Я запустил приложение Rails, и все работает отлично. Но теперь я хотел бы переименовать контроллер и связанную с ним модель:

Я хотел изменить контроллер Corps на Stores и тот же (без окончательного s) для модели.

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

Любое решение? Спасибо заранее.

Ответ 1

Вот что я сделал бы:

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

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

Измените имя файла модели, определение класса модели и ассоциации модели:

  • Переименование файлов: corp.rbstore.rb
  • Код store.rb: измените class Corp на class Store
  • Переименуйте все ассоциации моделей, например has_many :corpshas_many :stores

Измените имя файла контроллера и определение класса контроллера:

  • Переименование файлов: corps_controller.rbstores_controller.rb
  • Код stores_controller.rb: измените class CorpsController на class StoresController

Переименовать папки просмотра. От corps до stores.

Внесите необходимые изменения в пути в файле config/routes.rb, например resources :corpsresources :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 и более), чтобы обнаружить дополнительные файлы, которые необходимо изменить. И теперь для шагов переименования:

  • Измените все файлы (имя и содержимое) include Corps/Corp на Stores/Store в папке db/migrate
  • Попробуйте запустить:

    rake db: drop: all

    rake db: create

    rake db: migrate

  • Измените содержимое файла db/seeds.rb.

  • Попробуйте запустить: rake db:seed --trace (На этом этапе вам может потребоваться изменить некоторые другие файлы модели/контроллера.)
  • Измените test/fixtures файлы. вам может потребоваться изменить не только corps.yml, но и другие связанные файлы (некоторые файлы могут включать corp_id).
  • Попробуйте запустить тесты, лучше запустить его с фиксированным семенем (добавить: TESTOPTS="--seed=1981" или любой другой номер)
  • Переименуйте файлы (имя и содержимое), будьте осторожны, иногда вам нужно изменить тест и другой файл приложения.

Ответ 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 файл и имя класса в файле
  • переименовывает имя миграции и имя класса и имена таблиц в файле

...