Как мне восстановиться после неудачного переименования модели ActiveRecord?

#ruby-on-rails #ruby #activerecord

#ruby-on-rails #ruby #activerecord

Вопрос:

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

К сожалению, ActiveRecord по-прежнему хочет использовать старое имя таблицы, даже если оно не отображается ни в одном файле моего проекта. Я предполагаю, что он был где-то кэширован, но я понятия не имею, где. В каталоге приложения tmp нет файлов, которые выглядят подозрительно.

На данный момент я добавил вызов «set_table_name» в модель, чтобы обойти проблему, но мне действительно интересно, где хранится старое имя таблицы и как от него избавиться.

Обновление: я пошел дальше и удалил каркас, используя «rails destroy scaffold». Когда я воссоздал ее (без опечатки), она воссоздала все с опечаткой! Я знаю, что опечатка где-то кэширована, но я понятия не имею, где.

Комментарии:

1. Вы забыли имя класса в (уже переименованных) файлах?

Ответ №1:

Рейф — Похоже, это может быть ошибка в Rails. Возможно, вы могли бы отправить запрос на извлечение Rails или попробовать добавить в файл config / initializers /inflections.rb.

Комментарии:

1. На самом деле это была ошибка inflector. (Это превращает «sidewalk_cafe» в «sidewalk_caves».)

Ответ №2:

вы исправили имя класса вашей модели? rails выводит имя таблицы из этого

например, «class Userr» -> «userrs»

Комментарии:

1. Да, я искал все экземпляры с неправильным именем класса и также заменил их.

Ответ №3:

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

Когда я rails generate model urser я просто rails destroy model urser начинаю заново.

Это просто уничтожает файлы, но это очень удобно и в rails 3 работает особенно хорошо для уничтожения каждого файла, созданного генератором.

Если я выполнял миграцию до обнаружения опечатки, я разрешу удалить миграцию скриптом уничтожения, разрешу generate записать новую, а затем rake db:rollback . Таким образом, urser_table из предыдущей миграции удаляется и создается user_table.

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

Если внутри тестов различных моделей, контроллеров или вспомогательных файлов много кода: я по-прежнему использую тот же подход, но перед запуском destroy передаю его в git, так что, если вам что-то понадобится, его всегда можно вернуть.

Ответ №4:

Хорошо, оказывается, что в Rails 3 (и, возможно, в других версиях), если вы попытаетесь сгенерировать модель с именем «Cafe», вместо нее будет использоваться название «cave». Понятия не имею, почему.

Вот пример. Я продублировал это и на разных компьютерах.

 holloway:whatever rafeco$ rails g scaffold Cafe 
  invoke  active_record
  create    db/migrate/20110412190231_create_caves.rb
  create    app/models/cafe.rb
  invoke    test_unit
  create      test/unit/cafe_test.rb
  create      test/fixtures/caves.yml
   route  resources :caves
  invoke  scaffold_controller
  create    app/controllers/caves_controller.rb
  invoke    erb
  create      app/views/caves
  create      app/views/caves/index.html.erb
  create      app/views/caves/edit.html.erb
  create      app/views/caves/show.html.erb
  create      app/views/caves/new.html.erb
  create      app/views/caves/_form.html.erb
  invoke    test_unit
  create      test/functional/caves_controller_test.rb
  invoke    helper
  create      app/helpers/caves_helper.rb
  invoke      test_unit
  create        test/unit/helpers/caves_helper_test.rb
  invoke  stylesheets
  create    public/stylesheets/scaffold.css