web-dev-qa-db-ja.com

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

Railsアプリを開始し、すべてが正常に動作します。しかし、今、コントローラーと関連モデルの名前を変更したいと思います。

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

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

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

85
htaidirt

ここに私がやることがあります:

migrationを作成して、テーブル名(データベースレベル)を変更します。古いテーブルはcorpsと呼ばれます。移行の内容は次のとおりです。

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

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

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

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

  • ファイル名の変更:corps_controller.rb-> stores_controller.rb
  • stores_controller.rbのコード:class CorpsControllerclass StoresControllerを変更

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

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

移行の実行を忘れないでください:)

前のものが不可能な場合は、db/schema.rbを削除して実行してください:

 $ rake db:drop db:create db:migrate
175
Nobita

のび太の答えに加えて、同様にtesthelperを変更する必要がありますcorpsstoreのクラス定義とファイル名。 さらに重要なことですconfig/routesでcorpsstoreに変更する必要があります.rbファイル

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

destroygenerateで提案されたものがより良い選択肢だと思います。ここでこれを行う方法についての答えを示しました: Rails:コントローラーと対応するモデルの名前を変更します

9
Holly

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

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

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のような他のディストリビューションには同じ名前の異なるユーティリティが付属していることがわかっています( https://unix.stackexchange.com/questions/78621/find- rename-command-doesnt-work )。 Ubuntuでは、代わりにこれを行います:

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

Seeds.rbファイルを除き、db /内のファイルの名前を変更しないようにするため、このディレクトリを除外して手動で変更を加えることをお勧めします。

6
Dan

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

rename_column :table, :old_id, :new_id

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

belongs_to :new, foreign_key: "old_id"

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

5
Pwnrar

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

使用法:

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

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

インストールする:
gem install Rails_refactor

使用する前に、Railsプロジェクトのルートに移動したことを確認してください。

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

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

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

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

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

  • モデルファイルとファイル内のクラス名を変更します
  • ファイルの仕様ファイルとクラス名を変更します
  • ファイル内の移行、クラス名、テーブル名を変更します

...

4
Asme Just

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

この手順を繰り返し実行します。場合によっては、変更が必要な追加ファイルを発見するために、手順に数回(5回以上)戻る必要があります。次に、名前変更手順について説明します。

  1. Corps/CorpフォルダーのStores/Storedb/migrateに含めるすべてのファイル(名前とコンテンツ)を変更します
  2. 実行してみてください:

    rake 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
ChaosPredictor

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

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

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

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

コントローラの場合、次の場所で変更する必要があります手動

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

モデルの場合、のび太の答えはかなり良い

0
Red