95

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

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

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

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

4

8 に答える 8

188

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

テーブル名 (データベース レベル) を変更するための移行を作成します。あなたの古いテーブルは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のように、ファイル内のパスに必要な変更を加え、コード内のすべての参照が corps から store に変更されていることを確認します (corps_path, ...)resources :corpsresources :stores

忘れずに移行を実行してください:)

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

 $ rake db:drop db:create db:migrate
于 2012-08-12T17:28:45.643 に答える
10

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

したがって、全体として、コントローラー、関連するモデル、ビュー、ヘルパー、テスト、およびルート ファイルに変更を加えることになります。

destroy&で提案されてgenerateいるのは、より良いオプションだと思います。ここでこれを行う方法に答えました:Rails:コントローラーと対応するモデルの名前を変更する

于 2012-11-16T11:44:53.613 に答える
6

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

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

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 ファイル内を除いて、おそらくこのディレクトリを除外し、手動で変更する必要があります。

于 2014-12-09T10:23:23.500 に答える
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/...」で検索されるため、画像を削除して再アップロードするか、新しいパスに移動するか、場所を変更する必要があります。探しています。

于 2014-10-19T07:08:53.747 に答える
0

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

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

  1. フォルダー内のインクルードCorps/Corp先のすべてのファイル (名前とコンテンツ) を変更Stores/Storeしますdb/migrate
  2. 実行してみてください:

    レーキ データベース:ドロップ:すべて

    rake db:作成

    rake db:移行

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

  4. 実行してみてください: rake db:seed --trace(このステップでは、他のモデル/コントローラー ファイルを変更する必要がある場合があります。)
  5. ファイルを変更test/fixturesします。corps.yml だけでなく、他の関連ファイル (一部のファイルには corp_id が含まれる場合があります) を変更する必要がある場合があります。
  6. テストを実行してみてください。固定シード (add:TESTOPTS="--seed=1981"またはその他の数値)で実行することをお勧めします。
  7. ファイル (名前とコンテンツ) の名前を変更します
于 2016-09-05T11:23:02.733 に答える