Rails アプリを開始しましたが、すべて正常に動作します。しかし今、コントローラーと関連するモデルの名前を変更したいと思います。
Corps
モデルのコントローラーをStores
同じ(最終的なsなし)に変更したかったのです。
Google を見ると、コントローラーとモデルを破棄してから再度生成することを提案されました。問題は、各ファイルの実際のコードを消去してしまうことです!
解決策はありますか?前もって感謝します。
Rails アプリを開始しましたが、すべて正常に動作します。しかし今、コントローラーと関連するモデルの名前を変更したいと思います。
Corps
モデルのコントローラーをStores
同じ(最終的なsなし)に変更したかったのです。
Google を見ると、コントローラーとモデルを破棄してから再度生成することを提案されました。問題は、各ファイルの実際のコードを消去してしまうことです!
解決策はありますか?前もって感謝します。
これが私がすることです:
テーブル名 (データベース レベル) を変更するための移行を作成します。あなたの古いテーブルは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
のように、ファイル内のパスに必要な変更を加え、コード内のすべての参照が corps から store に変更されていることを確認します (corps_path, ...)resources :corps
resources :stores
忘れずに移行を実行してください:)
前のことが不可能な場合は、db/schema.rb を削除して実行してみてください。
$ rake db:drop db:create db:migrate
のび太の回答に加えて、同様に のテストとヘルパークラスの定義とファイル名corps
を変更する必要がありますstore
。 さらに重要なことは、config/routes.rbファイルを変更corps
する必要があることです。store
したがって、全体として、コントローラー、関連するモデル、ビュー、ヘルパー、テスト、およびルート ファイルに変更を加えることになります。
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-を参照)。動作しません)。Ubuntu では、代わりに次のようにします。
shopt -s globstar
rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps*
db/ 内のすべてのファイルの名前を変更することは避けたいことに注意してください。ただし、seeds.rb ファイル内を除いて、おそらくこのディレクトリを除外し、手動で変更する必要があります。
もう 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 回以上) 戻る必要がある場合があります。次に、名前の変更手順について説明します。
Corps/Corp
先のすべてのファイル (名前とコンテンツ) を変更Stores/Store
しますdb/migrate
実行してみてください:
レーキ データベース:ドロップ:すべて
rake db:作成
rake db:移行
ファイルの内容を変更しdb/seeds.rb
ます。
rake db:seed --trace
(このステップでは、他のモデル/コントローラー ファイルを変更する必要がある場合があります。)test/fixtures
します。corps.yml だけでなく、他の関連ファイル (一部のファイルには corp_id が含まれる場合があります) を変更する必要がある場合があります。TESTOPTS="--seed=1981"
またはその他の数値)で実行することをお勧めします。