Как переименовать контроллер rails и модель в проекте
Я запустил приложение Rails, и все работает нормально. Но теперь я хотел бы переименовать контроллер и связанную с ним модель:
Я хотел изменить до Stores
и то же самое (без конечных s) для модели.
глядя на google, люди предложили уничтожить, а затем снова создать контроллер и модель. Проблема в том, что он будет стирать фактический код каждого файла!
любое решение? Спасибо заранее.
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 и более), чтобы обнаружить дополнительные файлы, которые должны быть измененный. А теперь для переименования шагов:
- изменить все файлы (имя и содержимое) включить
Corps/Corp
доStores/Store
indb/migrate
папкупытаюсь запустить:
rake db: drop: all
rake db: create
rake db: migrate
изменить содержимое .
- попробуйте запустить:
rake db:seed --trace
(на этом шаге вам может потребоваться изменить какую-либо другую модель / контроллер файлы.)- изменить
test/fixtures
файлы. возможно, вам придется менять не только корпус.yml, но другие связанные файлы (некоторые файлы могут включать corp_id).- попробуйте запустить свои тесты, лучше запустить его с фиксированным семенем (добавить:
TESTOPTS="--seed=1981"
или любое другое число)- переименовать в файлы (имя и содержимое) будьте осторожны иногда вам нужно изменить тест и другой файл приложения