プロジェクトのRailsコントローラーとモデルの名前を変更する方法


91

Railsアプリを起動したところ、すべて正常に動作しました。しかし、今、私はコントローラと関連するモデルの名前を変更したいと思います:

モデルのCorpsコントローラーをStores(finalなしで)同じに変更したいと思いました。

グーグルを見て、人々は破壊して、それからコントローラとモデルを再び生成することを提案しました。問題は、各ファイルの実際のコードが消去されることです。

解決策はありますか?前もって感謝します。

回答:


180

これが私がすることです:

テーブル名(データベースレベル)を変更する移行を作成します。あなたの古いテーブルは軍団と呼ばれていると思います。移行内容は次のとおりです。

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

モデルファイル名、モデルクラス定義、モデルの関連付けを変更します。

  • ファイル名の変更:corp.rb->store.rb
  • コードstore.rb変更:class Corpについてclass Store
  • すべてのモデルの関連付けの名前を次のように変更しますhas_many :corps->has_many :stores

コントローラファイル名とコントローラクラス定義を変更します。

  • ファイル名の変更:corps_controller.rb->stores_controller.rb
  • コードstores_controller.rb変更:class CorpsControllerについてclass StoresController

ビューフォルダの名前を変更します。からcorpsまでstores

->のconfig/routes.rbように、ファイル内のパスに必要な変更を加え、コード内のすべての参照がcorpsからstore(corps_path、...)に変更されていることを確認します。resources :corpsresources :stores

移行を実行することを忘れないでください:)

以前の方法が不可能な場合は、db / schema.rbを削除して実行します。

 $ rake db:drop db:create db:migrate

2
すべての:corpsルートを:storesルートにポイントするようにconfig / routes.rbを変更することに言及したいと思うかもしれません
tgf

1
find -name "oldname_on_singular?*名前を変更するファイルのリストを取得するために実行します。次に、calcにコピーし、2番目と3番目の列に2回貼り付けます。最初の列に私はrenameコマンドを追加して、新しい名前の最後の列Iの変更に、のようなもの:git mv ./spec/views/oldname ./spec/views/new name
エドゥアルド・サンタナ

メインのリストには、@ EduardoSantanaによって言及された新しいモデル/クラス名でテストファイルを編集することができません。
user2953607

10

のび太の回答に加えて、同様にテストヘルパーのクラス定義とファイル名をcorpsに変更する必要がありますstoreさらに重要なこととして、config / routes.rbファイルを次のcorpsようstoreに変更する必要があります。

つまり、コントローラ、関連するモデル、ビュー、ヘルパー、テスト、およびルートファイルに変更を加えます。

あなたが見たものはdestroygenerateで提案された方が良いオプションだと思います。ここでこれを行う方法を答えました:Rails:コントローラーと対応するモデルの名前を変更する


7

Rails Refactor gemも試すことができます。これは、Railsプロジェクトのモデルやコントローラーの名前変更などの単純なリファクタリング用のコマンドラインツールです。

使用法:

Railsプロジェクトの基本的な名前変更とリファクタリング。これらは完璧ではありませんが、多くの作業を行って時間を節約します。

使用する前に、変更を簡単に確認できるように、リポジトリをクリーンな状態から開始することをお勧めします。

インストールするには:
gem install rails_refactor

使用する前に、railsプロジェクトのルートにcdしてください。

コントローラの名前を変更するには:
rails_refactor rename OldController NewController

  • ファイル内のコントローラーファイルとクラス名を変更します
  • ファイル内のコントローラスペックファイルとクラス名を変更します
  • ビューディレクトリの名前を変更します
  • ファイル内のヘルパーファイルとモジュール名を変更します
  • ルートを更新する

コントローラアクションの名前を変更するには:
$ rails_refactor rename DummyController.old_action new_action

  • コントローラクラスファイルのコントローラアクションの名前を変更します
  • すべてのフォーマットのビューファイルの名前を変更します

モデルの名前を変更するには:
$ rails_refactor rename OldModel NewModel

  • ファイル内のモデルファイルとクラス名を変更します
  • ファイル内のスペックファイルとクラス名の名前を変更します
  • ファイル内のマイグレーションとクラス名とテーブル名を変更します

...


6

Nobitaの回答(十分な担当者がいたらコメントします)に加えて、勇気がある場合は、ファイル名の変更とコード内のモデルへの参照をある程度自動化できます。たとえば、コード内の参照を変更するには、次を使用できます

単数、マイナス、メイス:

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

複数形、マイナス形、およびメイユ形(複数形だけが必要で、最後にs文字がある場合は、複数形を単数形に置き換えます):

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

ファイル名を変更:

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

一部の* nixフレーバー(Slackwareを含む)には、ファイル名の変更に役立つrenameというユーティリティがあります。

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

名前の変更はあなたが思っているとおりですが、同じ名前の別のユーティリティが同梱されているUbuntuのような他のディストリビューションも知っています/unix/78621/find-rename-command-を参照)。動作しません)。Ubuntuでは代わりにこれを行います:

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

おそらくseeds.rbファイルを除いて、db /のファイルの名前を変更したくないので、このディレクトリを除外して手動で変更を加えたいことに注意してください。


5

もう1つの重要なことは、モデルの関連付けを更新する必要があることです。手動で名前を変更するか、リソースを破棄して生成するか(他のモデルに存在するため)を行う必要があります。マイグレーションを実行して、データベース内の外部キーの列名を変更し、コード内のそれらの外部キーへのすべての参照を変更することができます。

rename_column :table, :old_id, :new_id

または、古い外部キーを使用する関連付けを宣言するときに、カスタム外部キーを設定します。

belongs_to :new, foreign_key: "old_id"

また、リソースに画像が含まれている場合、それらは多くの場合、リソース名を含むディレクトリに保存されますが、(少なくともcarrierwaveを使用して)リソース名が変更されると、それらは誤って参照されます(ファイルは '/ uploads / old / image /に存在します1 / pic.jpg」ですが、「uploads / new / ...」で検索されるため、画像を削除して再アップロードするか、新しいパスに移動するか、画像の場所を変更する必要があります。探しています。


0

モデルテストがある場合は、変更する必要があります。

ファイル名の変更:corp_test.rb-> store_test.rb(コントローラーテスト、統合テスト、フィクスチャなども対象)

store_test.rbのコード:StoreTestクラスのCorpTestクラスを変更します。

そして、コントローラ、モデル、統合、フィクスチャテストにおけるcorpのすべての参照。


0

この苦痛なプロセスを終えたばかりの人として、最も重要なステップは、できるだけ多くの機能をチェックするために十分なテストを構築することです。名前を変更する予定のモデル/コントローラーだけでなく、他のすべてのモデル/コントローラー/ビューのパーツもカバーする必要があります。とにかく、それは良い(あるいはおそらく必須の)練習です。

この手順を繰り返し実行します。変更が必要な追加のファイルを見つけるために、いくつかの手順(5回以上)に戻る必要がある場合があります。そして今、名前の変更手順について:

  1. 含まれるすべてのファイル(名前と内容)の変更Corps/CorpStores/Storedb/migrateフォルダを
  2. 実行してみてください:

    レーキdb:drop:all

    rake db:create

    rake db:migrate

  3. db/seeds.rbファイルの内容を変更します。

  4. 実行してみてください rake db:seed --trace(このステップでは、他のモデル/コントローラーファイルを変更する必要がある場合があります)。
  5. test/fixturesファイルを変更します。corps.ymlだけでなく、その他の関連ファイルを変更する必要がある場合があります(一部のファイルにはcorp_idが含まれている場合があります)。
  6. テストを実行してみてください。シードを固定して実行することをお勧めします(追加:TESTOPTS="--seed=1981"またはその他の番号)
  7. ファイルの名前を変更します(名前と内容)場合によっては、テストやその他のアプリファイルを変更する必要があります

0

コントローラのために、あなたはそれをやっている場合は、次の場所に変更を加える必要があります手動で

  • ルート
  • アプリ/ビュー
  • アプリ/コントローラー
  • テスト/コントローラー
  • アプリ/ヘルパー
  • app / assets / javascripts /
  • app / assets / stylesheets /

モデルについては、のび太の答えはかなり良いです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.