#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