Railsアプリを開始し、すべてが正常に動作します。しかし、今、コントローラーと関連モデルの名前を変更したいと思います。
モデルのCorps
コントローラーをStores
と同じ(finalなしで)に変更したかったのです。
グーグルを見ると、人々はコントローラーとモデルを破壊してから再度生成することを提案しました。問題は、各ファイルの実際のコードが消去されることです!
解決策はありますか?前もって感謝します。
ここに私がやることがあります:
migrationを作成して、テーブル名(データベースレベル)を変更します。古いテーブルはcorpsと呼ばれます。移行の内容は次のとおりです。
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
-> resources :corps
などのresources :stores
ファイルのパスに必要な変更を加え、コード内のすべての参照がcorpsからstore(corps_path、...)に変更されることを確認します。
移行の実行を忘れないでください:)
前のものが不可能な場合は、db/schema.rbを削除して実行してください:
$ rake db:drop db:create db:migrate
のび太の答えに加えて、同様にtest&helperを変更する必要がありますcorps
〜store
のクラス定義とファイル名。 さらに重要なことですconfig/routesでcorps
をstore
に変更する必要があります.rbファイル
合計で、コントローラー、関連するモデル、ビュー、ヘルパー、テスト、およびルートファイルに変更を加えています。
destroy
とgenerate
で提案されたものがより良い選択肢だと思います。ここでこれを行う方法についての答えを示しました: Rails:コントローラーと対応するモデルの名前を変更します
ノビタの答えに加えて(十分な担当者がいる場合はコメントします)、勇気がある場合は、コードのファイル名とモデルへの参照の変更をある程度自動化できます。たとえば、コード内の参照を変更するには、使用できます
単数形、マイナス、メイサス:
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 /内のファイルの名前を変更しないようにするため、このディレクトリを除外して手動で変更を加えることをお勧めします。
もう1つの重要なことは、モデルの関連付けを更新する必要があることです。これは、手動で名前を変更するか、リソースを破棄して生成する(他のモデルに存在するため)必要があります。移行を実行して、データベース内の外部キーの列名を変更し、コード内のそれらの外部キーへのすべての参照を変更できます。
rename_column :table, :old_id, :new_id
または、古い外部キーを使用する関連付けを宣言するときにカスタム外部キーを設定します。
belongs_to :new, foreign_key: "old_id"
また、リソースに画像が含まれている場合、リソース名を含むディレクトリに保存されることがよくありますが、リソース名が変更されると(少なくともCarrierwaveを使用して)誤って参照されます(ファイルは '/ uploads/old/image /に存在します) 1/pic.jpg」が「uploads/new/...」で検索されているため、画像を削除して再アップロードするか、新しいパスに移動するか、場所を変更する必要があります」再探しています。
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
- モデルファイルとファイル内のクラス名を変更します
- ファイルの仕様ファイルとクラス名を変更します
- ファイル内の移行、クラス名、テーブル名を変更します
...
この痛みを伴うプロセスを終えたばかりの人として、最も重要なステップは、できるだけ多くの機能をチェックするのに十分な[〜#〜] tests [〜#〜]を構築することです。これらは、名前を変更する予定のモデル/コントローラーだけでなく、他のすべてのモデル/コントローラー/ビューパーツもカバーする必要があります。とにかく、それは良い(またはおそらく必要な)実践です。
この手順を繰り返し実行します。場合によっては、変更が必要な追加ファイルを発見するために、手順に数回(5回以上)戻る必要があります。次に、名前変更手順について説明します。
Corps/Corp
フォルダーのStores/Store
をdb/migrate
に含めるすべてのファイル(名前とコンテンツ)を変更します実行してみてください:
rake db:drop:all
rake db:create
rake db:migrate
db/seeds.rb
ファイルの内容を変更します。
rake db:seed --trace
(このステップでは、他のモデル/コントローラーファイルを変更する必要がある場合があります。)test/fixtures
ファイルを変更します。 corps.ymlだけでなく、他の関連ファイル(一部のファイルにはcorp_idが含まれる場合があります)の変更が必要になる場合があります。TESTOPTS="--seed=1981"
またはその他の番号)モデルテストがある場合は、変更する必要があります。
ファイル名の変更:corp_test.rb-> store_test.rb(コントローラーテスト、統合テスト、フィクスチャなどにも使用)
Store_test.rbのコード:クラスStoreTestのクラスCorpTestを変更します。
また、コントローラ、モデル、統合、フィクスチャテストにおけるcorpのすべての参照。
コントローラの場合、次の場所で変更する必要があります手動:
モデルの場合、のび太の答えはかなり良い