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

92

Comencé 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 Corpscontrolador Storesy el mismo (sin los finales) para el modelo.

Buscando en Google, la gente sugirió destruir y luego generar nuevamente el controlador y el modelo. ¡El problema es que borrará el código real de cada archivo!

¿Alguna solución? Gracias por adelantado.

htaidirt
fuente

Respuestas:

182

Esto es lo que haría:

Cree una migración para cambiar el nombre de la tabla (nivel de base de datos). Supongo que su vieja mesa se llama corps . El contenido de la migración será:

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

Cambie el nombre de archivo de su modelo, la definición de su clase de modelo y las asociaciones del modelo:

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

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

  • Cambio de nombre de archivo: corps_controller.rb->stores_controller.rb
  • Código de stores_controller.rb: Cambio class CorpsControllerparaclass StoresController

Cambiar el nombre de las carpetas de vistas. Desde corpshasta stores.

Realice los cambios necesarios en las rutas en el config/routes.rbarchivo, 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 lo anterior no es posible, intente eliminar db / schema.rb y ejecute:

 $ rake db:drop db:create db:migrate
Nobita
fuente
2
Es posible que desee mencionar para cambiar config / routes.rb para apuntar todas las rutas de: corps a: rutas de tiendas
tgf
1
Corro find -name "oldname_on_singular?*para obtener una lista de archivos para cambiar el nombre. Luego lo copio en calc, lo 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 por el nuevo nombre, algo así como:git mv ./spec/views/oldname ./spec/views/new name
Eduardo Santana
Falta la lista principal editando los archivos de pruebas con el nuevo modelo / nombre de clase, mencionado por @EduardoSantana.
user2953607
rake db:dropes super peligroso! ¡Le recomendaría que elimine esta línea para cambiarla a "rake db: migrate"! ¡La gente tiende a copiar, pegar y ejecutar!
Sagar Ranglani
10

Además de la respuesta de Nobita, también debe cambiar las definiciones de la clase de prueba y ayudante y los nombres de archivo para corpsa store. Más importante aún , debe cambiar corpsa storeen su archivo config / routes.rb

Entonces, en total, está realizando cambios en el controlador, el modelo asociado, las vistas, los ayudantes, las pruebas y los archivos de rutas.

Creo que lo que has visto sugerido con destroy& generatees una mejor opción. He dado una respuesta sobre cómo hacer esto aquí: Rails: renombrar un controlador y el modelo correspondiente

Acebo
fuente
7

Puedes probar Rails Refactor gema , una herramienta de línea de comandos para refactores simples como cambiar el nombre del modelo y el controlador para proyectos de Rails

Uso:

Cambios de nombre y refactorización básicos para proyectos de rieles. Aunque no son perfectos, harán gran parte del trabajo por usted y le ahorrarán tiempo.

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

Instalar:
gem install rails_refactor

Antes de usarlo, asegúrese de ir a 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 especificaciones del controlador y el nombre de la clase en el archivo
  • cambia el nombre del directorio de la vista
  • cambia el nombre del archivo auxiliar y el nombre del módulo 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 visualización para todos los formatos

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

  • cambia el nombre del archivo modelo y el nombre de la clase en el archivo
  • cambia el nombre del archivo de especificaciones y el nombre de la clase en el archivo
  • cambia el nombre de la migración y el nombre de la clase y los nombres de las tablas en el archivo

...

Asme solo
fuente
6

Además de la respuesta de Nobita (que comentaría si tuviera suficiente representante), si se siente valiente, los cambios en los nombres de archivo y las referencias al modelo en su código pueden automatizarse 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, minus y mayus (el 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'

Cambiar el nombre de los archivos:

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

Y hay una utilidad llamada renombrar en algunos sabores * nix (incluido Slackware) que lo ayudará a renombrar los archivos:

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

Sin embargo, verifique que el cambio de nombre es lo que cree que es, he conocido otras distribuciones como Ubuntu que se envían con una utilidad diferente del mismo nombre (consulte /unix/78621/find-rename-command- no funciona ). 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 los archivos en db / excepto posiblemente en su archivo seeds.rb, por lo que probablemente desee excluir este directorio y realizar los cambios manualmente.

Dan
fuente
5

Otra cosa importante es que necesita actualizar las asociaciones del modelo, lo que tendrá que hacer ya sea que cambie el nombre manualmente o destruya y genere el recurso (ya que existen en los otros modelos). Puede ejecutar una migración para cambiar los nombres de columna 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 establezca 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 al menos) una vez que se cambia el nombre del recurso, se hará referencia a ellas 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' están siendo buscados.

Pwnrar
fuente
0

Y si tiene pruebas de modelo, necesita cambiar:

Cambio de nombre de archivo: corp_test.rb -> store_test.rb (también para pruebas de controlador, 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 fijación.

Benjamin J. Benoudis
fuente
0

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 al que planea cambiar el nombre, sino también todos los demás modelos / controladores / partes de vistas. De todos modos es una buena (o tal vez incluso una práctica obligada).

Realice estos pasos por iteraciones, a veces debe 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. Cambiar todos los archivos (nombre y contenido) Incluir Corps/Corpa Stores/Storeen la db/migratecarpeta
  2. Intenta ejecutar:

    rake db: drop: all

    rake db: crear

    rake db: migrar

  3. Cambiar el contenido del db/seeds.rbarchivo.

  4. Intente ejecutar: rake db:seed --trace(En este paso, es posible que deba cambiar otros archivos de modelo / controlador).
  5. Cambiar test/fixturesarchivos. es posible que deba cambiar no solo corps.yml sino 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. Cambiar el nombre de los archivos (nombre y contenido) tenga cuidado, a veces es necesario cambiar la prueba y otro archivo de la aplicación
CaosPredictor
fuente
0

para el controlador, tendrá que realizar 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 /

por modelo, la respuesta de Nobita es bastante buena

Ravi
fuente