2012-08-12 31 views
70

Inicié una aplicación Rails y todo funciona bien. Pero ahora, me gustaría cambiar el nombre de un controlador y el modelo asociado:Cómo cambiar el nombre del controlador y modelo de rieles en un proyecto

Yo quería cambiar el controlador Corps a Stores y el mismo (sin s final) para el modelo.

Buscando en google, las personas sugirieron 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.

Respuesta

142

Aquí es lo que haría:

Crear una migraciónpara cambiar el nombre de la tabla (nivel de base de datos). Supongo que su tabla anterior se llama cuerpo. El contenido de la migración será:

class RenameCorpsToStores < ActiveRecord::Migration 
    def change 
    rename_table :corps, :stores 
    end 
end 

Cambiar el nombre del modelo de archivos, su definición de clase modelo y las asociaciones de modelos:

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

cambiar su nombre de archivo de controlador y su definición de clase controlador:

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

Renombrar vistas carpetas. 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 cambio de código de cuerpos a las tiendas (corps_path, ...)

Recuerda ejecutar la migración :)

Si anterior no es posible, tratar de eliminar la db/schema.rb y ejecutar:

$ rake db:drop db:create db:migrate 
+1

Podría mencionar para cambiar config/rout es.rb para señalar todas las rutas: corps a: almacena las rutas – tgf

+0

Ejecuto 'find -name" oldname_on_singular? * 'para obtener una lista de los archivos a cambiar de nombre. Luego lo copio en calc, pego dos veces en la segunda y tercera columna. En la primera columna agrego el comando de cambio de nombre y en la última columna cambio para el nuevo nombre, algo así como: 'git mv ./spec/views/oldname ./spec/views/new name' –

8

Además de Nob ita responder de manera similar que necesita cambiar las prueba & ayudante definiciones de clases & nombres de archivo para corps a store. Más importante aún debe cambiar corps a store en su config/routes.rb archivo

Así que, en total, está realizando cambios en el controlador, el modelo asociado, vistas, ayudantes, pruebas y archivos de rutas.

Creo que lo que ha visto sugerido con destroy & generate es una mejor opción. He dado una respuesta sobre cómo hacer esto aquí: Rails : renaming a controlller and corresponding model

3

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 de cambiar los nombres de las columnas de las claves externas de la base de datos y cambiar todas las referencias a las claves foráneas en el código:

rename_column :table, :old_id, :new_id 

o establecer una clave personalizada extranjera cuando se declara la asociación que utiliza el antigua clave externa:

belongs_to :new, foreign_key: "old_id" 

Además, si su recurso incluye imágenes, que a menudo se almacenan en un directorio que incluye el nombre del recurso, pero (con al menos carrierwave) una vez que se cambió el nombre del recurso que va a ser referenciados de forma incorrecta (el archivo existe en '/uploads/old/image/1/pic.jpg' pero se lo busca en 'uploads/new/...'), por lo que tendrá que o bien del Comience y vuelva a cargar las imágenes, muévalas a la nueva ruta o, quizás, cambie el lugar donde las está buscando.

0

Y si usted tiene pruebas de modelo, tiene que cambiar:

archivo de cambio de nombre: corp_test.rb -> store_test.rb (también para las pruebas del controlador, pruebas de integración, accesorio, etc.)

Código de store_test.rb: Cambiar la clase CorpTest para la clase StoreTest.

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

6

Además de la respuesta de Nobita (que comentaría si tuviera suficientes representantes), si se siente valiente, los cambios en los nombres de archivo y las referencias al modelo en su código se pueden automatizar de alguna manera. Por ejemplo, para cambiar las referencias en el código que puede utilizar

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 sólo las necesidades y s plurales carácter 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 de cambio de nombre de algunos sabores de * 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* 

Registro de cambio de nombre es lo que creo 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 podría hacer esto en su lugar:

shopt -s globstar 
rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps* 

Tenga en cuenta que usted quiere evitar el cambio de nombre en los archivos db/excepto posiblemente en su archivo seeds.rb, por lo que probablemente desee excluir este directorio y hacer los cambios manualmente.

0

Como alguien que acaba de terminar este doloroso proceso, el paso más importante es construir suficientes pruebas para comprobar 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 debe volver a los pasos varias veces (5 y más) para descubrir archivos adicionales que deben modificarse. Y ahora para los pasos de cambio de nombre:

  1. cambiar todos los archivos (nombre y contenido) el incluir Corps/Corp a Stores/Store en db/migrate carpeta
  2. intenta ejecutar:

    rake db: caída: todo

    rake db: crear

    rake db: migrate

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

  4. intenta ejecutar: rake db:seed --trace (. En este paso es posible que tenga que cambiar algunos otros archivos de modelo/controlador)
  5. Cambio test/fixtures archivos. Es posible que necesite cambiar no solo corps.yml sino otros archivos relacionados (algunos archivos pueden incluir corp_id).
  6. intenta ejecutar sus pruebas, es mejor para ejecutarlo con la semilla fija (añadir: TESTOPTS="--seed=1981" o cualquier otro número)
  7. Cambiar el nombre de archivos (nombre y contenido) que cuidarse a veces es necesario cambiar de prueba y otra aplicación de archivos
0

para el controlador tendrá que hacer cambios en los siguientes lugares si lo estás haciendo de forma manual :

  • ruta
  • app/VI EWS
  • app/controladores
  • prueba/controladores
  • app/ayudante
  • app/activos/javascripts/
  • app/activos/hojas de estilo/

para el modelo, la respuesta de Nobita es bastante bueno

1

Puede probar la gema Rails Refactor también, es una herramienta de línea de comandos para refactores simples como cambiar el nombre del modelo y el controlador para los proyectos de Rails

Uso:

cambios de nombre y refactorizaciones básicos para proyectos de carriles. Aunque estos son no perfectos, harán mucho por usted y le ahorrarán tiempo.

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

Para instalar:
gem install rails_refactor

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

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

  • cambia el nombre de archivo del controlador & nombre de la clase en el archivo
  • cambia el nombre de archivo de especificaciones del controlador nombre & clase en el archivo
  • cambia el nombre de directorio de vista
  • cambios de nombre archivo auxiliar & nombre del módulo en el archivo
  • actualizaciones rutas

Para cambiar el nombre de una acción de controlador:
$ rails_refactor rename DummyController.old_action new_action

  • renombra acción del controlador en el archivo de clase controlador
  • renombra archivos de vista para todos los formatos

Para cambiar el nombre un modelo:
$ rails_refactor rename OldModel NewModel

  • cambia el nombre de archivo del modelo & nombre de la clase en el archivo
  • cambia el nombre de archivo de especificaciones & nombre de la clase en el archivo
  • cambia el nombre de la migración & nombre de la clase & nombres de tabla en el archivo

...

Cuestiones relacionadas