Como renomear controlador Rails e modelo em um projeto


91

Iniciei um aplicativo Rails e tudo funciona bem. Mas agora, gostaria de renomear um controlador e o modelo associado:

Eu queria mudar o Corpscontrolador para Storese o mesmo (sem s finais) para o modelo.

Procurando no google, as pessoas sugeriram destruir e gerar novamente o controlador e o modelo. O problema é que ele apagará o código real de cada arquivo!

Qualquer solução? Desde já, obrigado.

Respostas:


181

Aqui está o que eu faria:

Crie uma migração para alterar o nome da tabela (nível do banco de dados). Presumo que sua velha mesa se chame corpo . O conteúdo da migração será:

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

Altere o nome do arquivo do modelo, a definição da classe do modelo e as associações do modelo:

  • Renomear arquivo: corp.rb->store.rb
  • Código de store.rb: Mudança class Corpparaclass Store
  • Renomeie todas as associações de modelo como has_many :corps->has_many :stores

Altere o nome do arquivo do controlador e a definição da classe do controlador:

  • Renomear arquivo: corps_controller.rb->stores_controller.rb
  • Código de stores_controller.rb: Mudança class CorpsControllerparaclass StoresController

Renomear pastas de visualizações. De corpsa stores.

Faça as mudanças necessárias nos caminhos do config/routes.rbarquivo, como resources :corps-> resources :stores, e certifique-se de que todas as referências no código mudem de corps para store (corps_path, ...)

Lembre-se de executar a migração :)

Se o anterior não for possível, tente excluir o db / schema.rb e execute:

 $ rake db:drop db:create db:migrate

2
Talvez queira mencionar a alteração de config / routes.rb para apontar todas as: corps routes para: stores routes
tgf

1
Corro find -name "oldname_on_singular?*para obter uma lista de arquivos para renomear. Então copio no calc, colo duas vezes na segunda e na terceira coluna. Na primeira coluna adiciono o comando renomear e na última coluna altero para o novo nome, algo como:git mv ./spec/views/oldname ./spec/views/new name
Eduardo Santana

Falta a lista principal editar os arquivos de teste com o novo nome do modelo / classe, mencionado por @EduardoSantana.
user2953607

10

Além de resposta Nobita você semelhante necessário alterar as teste e auxiliares definições de classes e nomes de arquivo para corpsa store. Mais importante que você deve mudar corpsa storesua config / routes.rb arquivo

Portanto, no total, você está fazendo alterações nos arquivos do controlador, do modelo associado, das visualizações, dos auxiliares, dos testes e das rotas.

Acho que o que você viu sugerido com destroy& generateé uma opção melhor. Eu respondi como fazer isso aqui: Rails: renomeando um controlller e o modelo correspondente


7

Você pode tentar a gem Rails Refactor também, uma ferramenta de linha de comando para refatores simples como renomear modelo e controlador para projetos Rails

Uso:

Renomeações básicas e refatorações para projetos rails. Embora não sejam perfeitos, eles farão grande parte do trabalho para você e economizarão seu tempo.

Antes de usar, recomendamos que você comece a partir de um estado de repositório limpo para que possa revisar facilmente as alterações.

Para instalar:
gem install rails_refactor

Antes de usar, certifique-se de fazer o cd na raiz do seu projeto rails.

Para renomear um controlador:
rails_refactor rename OldController NewController

  • renomeia o arquivo do controlador e o nome da classe no arquivo
  • renomeia o arquivo de especificação do controlador e o nome da classe no arquivo
  • renomeia o diretório de visualização
  • renomeia o arquivo auxiliar e o nome do módulo no arquivo
  • atualiza rotas

Para renomear uma ação do controlador:
$ rails_refactor rename DummyController.old_action new_action

  • renomeia a ação do controlador no arquivo de classe do controlador
  • renomeia os arquivos de exibição para todos os formatos

Para renomear um modelo:
$ rails_refactor rename OldModel NewModel

  • renomeia o arquivo de modelo e o nome da classe no arquivo
  • renomeia o arquivo de especificação e o nome da classe no arquivo
  • renomeia a migração e o nome da classe e os nomes das tabelas no arquivo

...


6

Além da resposta de Nobita (que eu comentaria se tivesse representante suficiente), se você estiver se sentindo corajoso, as alterações nos nomes dos arquivos e referências ao modelo em seu código podem ser automatizadas de alguma forma. Por exemplo, para alterar as referências em seu código, você pode usar

Singular, menos e mayus:

grep -rl corp | xargs sed -i 's/corp/store/g'
grep -rl Corp | xargs sed -i 's/Corp/Store/g'

Plural, menos e mayus (o singular substitui o plural se o plural só precisar e o caractere s no final):

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

Renomear arquivos:

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

E há um utilitário chamado rename em alguns sabores * nix (incluindo Slackware) que o ajudará a renomear os arquivos:

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

No entanto, verifique se renomear é o que você pensa. Conheci outras distribuições como o Ubuntu que vêm com um utilitário diferente com o mesmo nome (consulte /unix/78621/find-rename-command- não funciona ). No Ubuntu, você faria isso:

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

Note que você deseja evitar renomear qualquer arquivo em db / exceto possivelmente em seu arquivo seed.rb, então você provavelmente deseja excluir este diretório e fazer quaisquer mudanças manualmente.


5

Outra coisa importante é que você precisa atualizar as associações de modelo, o que você terá que fazer se renomear manualmente ou destruir e gerar o recurso (uma vez que existem nos outros modelos). Você pode executar uma migração para alterar os nomes das colunas das chaves estrangeiras no banco de dados e alterar todas as referências a essas chaves estrangeiras no código:

rename_column :table, :old_id, :new_id

ou defina uma chave estrangeira personalizada ao declarar a associação que usa a chave estrangeira antiga:

belongs_to :new, foreign_key: "old_id"

Além disso, se o seu recurso inclui imagens, elas geralmente são armazenadas em um diretório que inclui o nome do recurso, mas (com carrierwave, pelo menos) assim que o nome do recurso for alterado, elas serão referenciadas incorretamente (arquivo existe em '/ uploads / old / image / 1 / pic.jpg 'mas é procurado em' uploads / new / ... '), então você terá que excluir e reenviar as imagens, movê-las para o novo caminho ou talvez alterar onde elas' está sendo procurado.


0

E se você tiver testes de modelo, você precisa mudar:

Renomeação de arquivo: corp_test.rb -> store_test.rb (também para testes de controlador, testes de integração, fixture, etc.)

Código de store_test.rb: Altere a classe CorpTest para a classe StoreTest.

E todas as referências de corp no controlador, modelo, integração, testes de fixação.


0

Como alguém que acabou de concluir esse processo doloroso, a etapa MAIS importante é construir TESTES suficientes para verificar o máximo de funcionalidade possível. Eles devem abranger não apenas o modelo / controlador que você planeja renomear, mas também todos os outros modelos / controladores / partes de visualizações. De qualquer forma, é uma boa (ou talvez até obrigatória) prática.

Faça isso etapas por iterações; às vezes, você precisa retornar às etapas algumas vezes (5 e mais) para descobrir arquivos adicionais que precisam ser alterados. E agora para as etapas de renomeação:

  1. Alterar todos os arquivos (nome e conteúdo) a incluir Corps/Corpa Stores/Storena db/migratepasta
  2. Tente executar:

    rake db: drop: all

    rake db: criar

    rake db: migrate

  3. Altere o conteúdo do db/seeds.rbarquivo.

  4. Tente executar: rake db:seed --trace(nesta etapa, você pode precisar alterar alguns outros arquivos de modelo / controlador.)
  5. Altere os test/fixturesarquivos. você pode precisar alterar não apenas corps.yml, mas outros arquivos relacionados (alguns arquivos podem incluir corp_id).
  6. Tente executar seus testes, é melhor executá-lo com semente fixa (adicione: TESTOPTS="--seed=1981"ou qualquer outro número)
  7. Renomear para arquivos (nome e conteúdo), tenha cuidado, às vezes você precisa alterar o arquivo de teste e outro aplicativo

0

para o controlador, você terá que fazer alterações nos seguintes lugares se estiver fazendo isso manualmente :

  • rota
  • app / views
  • app / controladores
  • teste / controladores
  • app / helper
  • app / assets / javascripts /
  • app / assets / stylesheets /

para modelo, a resposta de Nobita é muito boa

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.