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

93

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

Хотел поменять Corpsконтроллер на Storesтакой же (без финала) для модели.

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

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

хтаидирт
источник

Ответы:

183

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

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

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
Возможно, стоит
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в своем конфигурации / routes.rb файл

Таким образом, вы вносите изменения в Контроллер, связанные файлы Модели, Представлений, Помощников, Тестов и Маршрутов.

Я думаю, что то, что вы видели с помощью destroy&, generateявляется лучшим вариантом. Я дал ответ, как это сделать здесь: Rails: переименование контроллера и соответствующей модели

Холли
источник
7

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

Применение:

Основные переименования и рефакторинги для рельсовых проектов. Хотя они не идеальны, они сделают за вас большую часть работы и сэкономят ваше время.

Перед использованием рекомендуется начать с чистого состояния репозитория, чтобы вы могли легко просматривать изменения.

Установить:
gem install rails_refactor

Перед использованием убедитесь, что вы записали cd в корень вашего проекта rails.

Чтобы переименовать контроллер:
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'

Множественное число, минус и майус (единственное число заменяет множественное число, если во множественном числе нужен только символ 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}' {} \;

А в некоторых вариантах * nix (включая Slackware) есть утилита rename, которая поможет вам переименовать файлы:

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"

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

Pwnrar
источник
0

А если у вас есть модельные тесты, вам нужно изменить:

Переименование файла: corp_test.rb -> store_test.rb (также для тестов контроллера, интеграционных тестов, фикстур и т. Д.)

Код store_test.rb: изменить класс CorpTest на класс StoreTest.

И все ссылки корпорации в тестах контроллера, модели, интеграции, приспособлений.

Бенджамин Дж. Бенудис
источник
0

Для человека, который только что завершил этот болезненный процесс, НАИБОЛЕЕ важным шагом является создание достаточного количества ТЕСТОВ. чтобы проверить как можно больше функциональности. Они должны охватывать не только модель / контроллер, которые вы планируете переименовать, но и все другие части моделей / контроллеров / представлений. В любом случае это хорошая (а может быть, даже необходимость) практика.

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

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

    rake 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

для контроллера вам придется внести изменения в следующих местах, если вы делаете это вручную :

  • маршрут
  • приложение / просмотры
  • приложение / контроллеры
  • тест / контроллеры
  • приложение / помощник
  • приложение / активы / javascripts /
  • приложение / активы / таблицы стилей /

для модели ответ Нобиты неплохой

Рави
источник