Cómo cambiar el nombre del controlador rails y del modelo en un proyecto


Empecé una aplicación 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 lo mismo (sin s finales) para el modelo.

Mirando 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 de antemano.

Author: Rick Smith, 2012-08-12

8 answers

Esto es lo que yo haría:

Cree una migración para cambiar el nombre de la tabla (nivel de base de datos). Asumo que tu antigua 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 del archivo del modelo, la definición de la clase del modelo y las asociaciones del modelo:

  • Cambiar el nombre del archivo: corp.rb -> store.rb
  • Código de store.rb: Cambiar class Corp por class Store
  • Cambiar el nombre de todas las asociaciones de modelos como has_many :corps - > has_many :stores

Cambie el nombre del archivo del controlador y la definición de la clase del controlador:

  • Cambiar el nombre del archivo: corps_controller.rb -> stores_controller.rb
  • Código de stores_controller.rb: Cambiar class CorpsController por class StoresController

Cambiar el nombre de las carpetas de vistas. De corps a stores.

Haga 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 cambian de corps a stores (corps_path, ...)

Recuerde ejecutar la migración :)

Si anterior no es posible, intente eliminar la base de datos/esquema.rb y ejecutar:

 $ rake db:drop db:create db:migrate
 160
Author: Nobita,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-21 23:02:27

Además de la respuesta de Nobita, debe cambiar la prueba & helper definiciones de clase y nombres de archivo para corps a store. Lo que es más importante debe cambiar corps a store en su configuración/rutas.rb file

Así que en total está haciendo cambios en el Controlador, el Modelo asociado, las Vistas, los Ayudantes, las Pruebas y los archivos de rutas.

Creo que lo que has visto sugiere con destroy & generate es una mejor opción. He dado una respuesta cómo hacerlo esto aquí: Rails: renombrar un controlador y el modelo correspondiente

 9
Author: Holly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:51

Además de la respuesta de Nobita (que comentaría si tuviera suficiente rep), si te sientes valiente, los cambios en los nombres de archivo y las referencias al modelo en tu código se pueden automatizar un poco. Por ejemplo, para cambiar las referencias en su código puede 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 reemplazar el plural si el plural solo necesita y s carácter al final):

grep -rl corps | xargs sed -i 's/corps/stores/g'
grep -rl Corps | xargs sed -i 's/Corps/Stores/g'

Cambiar el nombre de los archivos:

find . -name '*corp*' -exec bash -c 'mv $0 ${0/corp/store}' {} \;

Y hay un utilidad llamada rename en algunos sabores * nix (incluyendo 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 renombrar es lo que crees que es, sin embargo, 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 cambiar el nombre de cualquier archivo en db/ excepto posiblemente en su semillas.archivo rb, por lo que probablemente desee excluir este directorio y realizar cualquier cambio manualmente.

 6
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:36:24

Otra cosa importante es que necesita actualizar las asociaciones de modelos, lo que tendrá que hacer si cambia el nombre manualmente o destruye y genera el recurso (ya que existen en los otros modelos). Puede ejecutar una migración para cambiar los nombres de columna de las claves foráneas en la base de datos y cambiar todas las referencias a esas claves foráneas en el código:

rename_column :table, :old_id, :new_id

O establecer una clave foránea personalizada al declarar la asociación que utiliza la antigua foránea clave:

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 al menos) una vez que se cambie el nombre del recurso, se hará referencia incorrectamente (el archivo existe en '/uploads/old/image/1/pic.jpg 'but is looked for at' uploads / new/...'), por lo que tendrá que eliminar y volver a cargar las imágenes, moverlas a la nueva ruta, o tal vez cambiar dónde se están buscando.

 5
Author: Pwnrar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-19 07:08:53

También puedes probar la gema Rails Refactor , una herramienta de línea de comandos para refactores simples como renombrar modelo y controlador para proyectos Rails

Uso:

Cambios de nombre básicos y refactorizaciones para proyectos rails. Aunque estos son no es perfecto, harán mucho trabajo por ti y te ahorrarán tiempo.

Antes de usar, le recomendamos que comience desde un estado de repositorio limpio para que pueda revisar fácilmente los cambios.

A instalar:
gem install rails_refactor

Antes de usar, asegúrese de que cd a la raíz de su proyecto rails.

Para cambiar el nombre de un controlador:
rails_refactor rename OldController NewController

  • cambia el nombre del archivo y clase del controlador en el archivo
  • cambia el nombre del archivo de especificaciones del controlador y el nombre de la clase en el archivo
  • renombra ver directorio
  • cambia el nombre del archivo y módulo de ayuda en el archivo
  • actualiza 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 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 y clase del modelo en el archivo
  • cambia el nombre del archivo y clase spec 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

...

 4
Author: Asme Just,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-05 17:54:07

Y si tiene pruebas modelo, debe cambiar:

Nombre del archivo: corp_test.rb - > store_test.rb (también para pruebas de controladores, pruebas de integración, accesorios, etc.)

Código de store_test.rb: Cambie la clase CorpTest por la clase StoreTest.

Y todas las referencias de corp en el controlador, modelo, integración, pruebas de accesorios.

 0
Author: Benjamin J. Benoudis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-19 08:55:37

Como alguien que acaba de terminar este doloroso proceso, el paso MÁS importante es construir suficientes PRUEBAS para comprobar tanta funcionalidad como sea posible. Deben cubrir no solo el modelo/controlador que planea renombrar, sino también todas las demás partes de modelos/controladores/vistas. De todos modos es una buena (o tal vez incluso una necesidad) práctica.

Haga estos pasos por iteraciones, a veces necesita volver a los pasos varias veces (5 y más) para descubrir archivos adicionales que deben cambiarse. Y ahora para los pasos de cambio de nombre:

  1. Cambie todos los archivos (nombre y contenido) del include Corps/Corp a Stores/Store en la carpeta db/migrate
  2. Intenta ejecutar:

    Rake db: drop: all

    Rake db: crear

    Rake db: migrar

  3. Cambiar el contenido del archivo db/seeds.rb.

  4. Intenta correr: rake db:seed --trace (En este paso es posible que necesite cambiar algunos otros archivos de modelo/controlador.)
  5. Cambia los archivos test/fixtures. es posible que tenga que cambiar no solo el cuerpo.yml pero otros archivos relacionados (algunos archivos pueden incluir corp_id).
  6. Intente ejecutar sus pruebas, es mejor ejecutarlo con semilla fija (agregue: TESTOPTS="--seed=1981" o cualquier otro número)
  7. Cambie el nombre a archivos (nombre y contenido) tenga cuidado a veces necesita cambiar la prueba y otro archivo de la aplicación
 0
Author: ChaosPredictor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-05 11:23:02

Para el controlador tendrá que hacer cambios en los siguientes lugares si lo está haciendo manualmente :

  • vía
  • app / views
  • app / controllers
  • prueba / controladores
  • aplicación / ayudante
  • app / assets / javascripts /
  • app / assets / stylesheets /

Para modelo, la respuesta de Nobita es bastante buena

 0
Author: Ravi Indorey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-09 15:27:11