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


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

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

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

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

8 80

8 ответов:

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

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

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.

внести необходимые изменения в пути в , как resources :corps ->resources :stores, и убедитесь, что все ссылки в коде меняются от корпуса к магазинам (corps_path,...)

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

если предыдущее невозможно, попробуйте удалить БД/схемы.РБ и выполнить:

 $ rake db:drop db:create db:migrate

в дополнение к ответу Nobita вам также нужно изменить тест & помощник определения классов и имена файлов для corps до store. Что Еще Более Важно вы должны изменить corps до store в своем в config/маршруты.РБ file

таким образом, в общей сложности вы вносите изменения в контроллер, связанную модель, представления, помощники, тесты и файлы маршрутов.

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

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

единственное число, минус и mayus:

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

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

и есть утилита под названием rename на некоторых * Nix вкусов (в том числе Slackware), которые помогут вам переименовать файлы:

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

Check rename - это то, что вы думаете, хотя я знаю, что другие дистрибутивы, такие как 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*

обратите внимание, что вы хотите избежать переименования любых файлов в БД/ за исключением, возможно, в ваших семенах.rb-файл, поэтому вы, вероятно, хотите исключить этот каталог и внести какие-либо изменения вручную.

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

rename_column :table, :old_id, :new_id

или установить пользовательский внешний ключ при объявлении ассоциации, которая использует старый иностранных ключ:

belongs_to :new, foreign_key: "old_id"

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

вы можете попробовать Rails Refactor камень тоже инструмент командной строки для простой переделывает как переименовать модель и контроллер для проектов рельсы

использование:

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

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

установка:
gem install rails_refactor

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

чтобы переименовать контроллер:
rails_refactor rename OldController NewController

  • переименовывает файл контроллера и имя класса в file
  • переименовывает файл спецификации контроллера и имя класса в file
  • переименовывает вид каталога
  • помощник переименовывает файл и имя модуля в файл
  • маршруты обновления

чтобы переименовать действие контроллера:
$ rails_refactor rename DummyController.old_action new_action

  • переименовывает действие контроллера в файле класса контроллера
  • переименовывает просмотр файлов для всех форматов

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

  • переименовывает файл модели и имя класса в file
  • переименовывает файл спецификации и имя класса в file
  • переименовывает миграцию и класс имя и имена таблиц в файле

...

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

переименование файла: corp_test.rb - > store_test.РБ (также для тестов регулятора, тестов интеграции, приспособления, ЕТК.)

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

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

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

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

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

    rake db: drop: all

    rake db: create

    rake db: migrate

  3. изменить содержимое .

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

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

  • маршрут
  • app / views
  • приложение/контроллеры