ruby on rails - Cómo cambiar el nombre de controlador y modelo de rieles en un proyecto
ruby-on-rails controller (8)
Empecé una aplicación de Rails y todo funciona bien. Pero ahora, me gustaría cambiar el nombre de un controlador y el modelo asociado:
Quería cambiar el controlador Corps
a Stores
y el mismo (sin s final) para el modelo.
Al buscar en google, la gente sugirió destruir y luego generar de nuevo el controlador y el modelo. ¡El problema es que borrará el código real de cada archivo!
¿Alguna solución? Gracias por adelantado.
Además de la respuesta de Nobita (que comentaría si tuviera suficientes representantes), si te sientes valiente, los cambios en los nombres de archivo y las referencias al modelo en tu código se pueden automatizar de alguna manera. Por ejemplo, para cambiar referencias en tu código, puedes usar
Singular, menos y mayus:
grep -rl corp | xargs sed -i ''s/corp/store/g''
grep -rl Corp | xargs sed -i ''s/Corp/Store/g''
Plural, menos y mayus (singular reemplaza el plural si el plural solo necesita y el carácter s al final):
grep -rl corps | xargs sed -i ''s/corps/stores/g''
grep -rl Corps | xargs sed -i ''s/Corps/Stores/g''
Renombrar archivos:
find . -name ''*corp*'' -exec bash -c ''mv $0 ${0/corp/store}'' {} /;
Y hay una utilidad llamada cambiar el nombre en algunos * nix sabores (incluido Slackware) que le ayudará a cambiar el nombre de los archivos:
shopt -s globstar
rename -v corps stores app/**/*corps* config/**/*corps* test/**/*corps*
Comprobar el cambio de nombre es lo que crees que es, he conocido otras distribuciones como Ubuntu para enviar con una utilidad diferente del mismo nombre (ver https://unix.stackexchange.com/questions/78621/find-rename-command-doesnt-work ). En Ubuntu, harías esto en su lugar:
shopt -s globstar
rename -v ''s/corps/stores/'' app/**/*corps* config/**/*corps* test/**/*corps*
Tenga en cuenta que desea evitar el cambio de nombre de los archivos en db / excepto posiblemente en su archivo seeds.rb, por lo que probablemente desee excluir este directorio y realizar los cambios manualmente.
Además de la respuesta de Nobita, de manera similar necesitas cambiar las definiciones de clase de prueba y ayuda y los nombres de archivo de los corps
para store
. Más importante aún , debe cambiar el corps
para store
en su archivo config / routes.rb
Entonces, en total, usted está haciendo cambios en el controlador, el modelo asociado, vistas, ayudantes, pruebas y archivos de rutas.
Creo que lo que has visto sugerido con destroy
& generate
es una mejor opción. He dado una respuesta sobre cómo hacer esto aquí: Rails: cambiar el nombre de un controlador y el modelo correspondiente
Como alguien que acaba de terminar este doloroso proceso, el paso más importante es construir suficientes PRUEBAS para verificar la mayor funcionalidad posible. Deben cubrir no solo el modelo / controlador que planea cambiar el nombre, sino también todos los demás modelos / controladores / partes de vistas. De todos modos, es una buena práctica (o tal vez incluso una obligatoria).
Realice estos pasos por iteraciones, a veces necesita volver a los pasos varias veces (5 o más) para descubrir archivos adicionales que deben modificarse. Y ahora para los pasos de cambio de nombre:
- Cambie todos los archivos (nombre y contenido) que incluyen
Corps/Corp
aStores/Store
en la carpetadb/migrate
Intenta ejecutar:
rake db: drop: all
rake db: crear
rake db: migrar
Cambiar el contenido del archivo
db/seeds.rb
.- Intente ejecutar:
rake db:seed --trace
(En este paso, es posible que necesite cambiar algunos otros archivos de modelo / controlador). - Cambiar archivos de
test/fixtures
. Es posible que necesite cambiar no solo corps.yml sino otros archivos relacionados (algunos archivos pueden incluir corp_id). - Intenta ejecutar tus pruebas, es mejor ejecutarlo con una semilla fija (agrega:
TESTOPTS="--seed=1981"
o cualquier otro número) - Cambiar el nombre a los archivos (nombre y contenido) tenga cuidado; algunas veces necesita cambiar la prueba y otro archivo de la aplicación
Esto es lo que haría:
Cree una migración para cambiar el nombre de la tabla (nivel de la base de datos). Supongo que tu vieja mesa se llama cuerpo . El contenido de la migración será:
class RenameCorpsToStores < ActiveRecord::Migration
def change
rename_table :corps, :stores
end
end
Cambie el nombre de su modelo de archivo, la definición de su clase de modelo y las asociaciones de modelos:
-
corp.rb
nombre de archivo:corp.rb
->store.rb
- Código de
store.rb
:class Corp
cambioclass Corp
forclass Store
- Cambie el nombre de todas las asociaciones modelo como
has_many :corps
->has_many :stores
Cambie el nombre de su archivo de controlador y la definición de clase de su controlador:
-
corps_controller.rb
nombre de archivo:corps_controller.rb
->stores_controller.rb
- Código de
stores_controller.rb
: Cambiar laclass CorpsController
para laclass StoresController
Cambiar el nombre de las carpetas de vistas. Del corps
a las stores
.
Realice los cambios necesarios en las rutas en el archivo config/routes.rb
, como resources :corps
-> resources :stores
, y asegúrese de que todas las referencias en el código cambien de corps a stores (corps_path, ...)
Recuerde ejecutar la migración :)
Si no es posible, intente eliminar el archivo db / schema.rb y ejecute:
$ rake db:drop db:create db:migrate
Otra cosa importante es que debe actualizar las asociaciones de modelos, lo que tendrá que hacer si renombra manualmente o destruye y genera el recurso (ya que existen en los otros modelos). Puede ejecutar una migración para cambiar los nombres de las columnas de las claves externas en la base de datos y cambiar todas las referencias a esas claves externas en el código:
rename_column :table, :old_id, :new_id
o establecer una clave externa personalizada al declarar la asociación que usa la clave externa anterior:
belongs_to :new, foreign_key: "old_id"
Además, si su recurso incluye imágenes, a menudo se almacenan en un directorio que incluye el nombre del recurso pero (con carrierwave como mínimo) una vez que se cambia el nombre del recurso, se hará referencia a ellos incorrectamente (el archivo existe en ''/ uploads / old / image / 1 / pic.jpg ''pero se busca en'' uploads / new / ... ''), por lo que tendrá que eliminar y volver a cargar las imágenes, moverlas a la nueva ruta, o quizás cambiar dónde están'' se está buscando.
También puede probar la gema Refactor de Rails , una herramienta de línea de comando para refactores simples como cambiar el nombre del modelo y el controlador para los proyectos de Rails.
Uso:
Renombrados básicos y refactorizaciones para proyectos de rieles. Aunque estos no son perfectos, harán mucho por usted y le ahorrarán tiempo.
Antes de usar, recomendamos que comience desde un estado de depósito limpio para que pueda revisar los cambios fácilmente.
Instalar:
gem install rails_refactor
Antes de su uso, asegúrese de hacer un cd en la raíz de su proyecto de rieles.
Para cambiar el nombre de un controlador:
rails_refactor rename OldController NewController
- cambia el nombre del archivo del controlador y el nombre de la clase en el archivo
- cambia el nombre del archivo de especificación del controlador y el nombre de clase en el archivo
- cambia el nombre del directorio de vista
- cambia el nombre del archivo auxiliar y el nombre del módulo en el archivo
- actualiza las rutas
Para cambiar el nombre de una acción del controlador:
$ rails_refactor rename DummyController.old_action new_action
- cambia el nombre de la acción del controlador en el archivo de la clase del controlador
- cambia el nombre de los archivos de vista para todos los formatos
Para cambiar el nombre de un modelo:
$ rails_refactor rename OldModel NewModel
- cambia el nombre del archivo de modelo y el nombre de clase en el archivo
- cambia el nombre del archivo de especificación y el nombre de clase en el archivo
- cambia el nombre de la migración y el nombre de la clase y los nombres de la tabla en el archivo
...
Y si tiene pruebas modelo, debe cambiar:
Cambio de nombre de archivo: corp_test.rb -> store_test.rb (también para pruebas de controlador, pruebas de integración, accesorio, etc.)
Código de store_test.rb: Cambiar clase CorpTest para la clase StoreTest.
Y todas las referencias de corp en el controlador, modelo, integración, pruebas de accesorios.
para el controlador, tendrá que hacer cambios en los siguientes lugares si lo hace manualmente :
- ruta
- aplicación / vistas
- aplicación / controladores
- prueba / controladores
- aplicación / ayudante
- app / assets / javascripts /
- app / assets / stylesheets /
para el modelo, la respuesta de Nobita es bastante buena