프로젝트에서 레일 컨트롤러 및 모델의 이름을 바꾸는 방법


92

Rails 앱을 시작했고 모든 것이 잘 작동합니다. 하지만 이제 컨트롤러와 관련 모델의 이름을 바꾸고 싶습니다.

나는 Corps컨트롤러를 Stores(최종 s없이) 로 변경하고 싶었습니다 .

Google에서 사람들은 컨트롤러와 모델을 파괴 한 다음 다시 생성 할 것을 제안했습니다. 문제는 각 파일의 실제 코드가 지워진다는 것입니다!

어떤 해결책이 있습니까? 미리 감사드립니다.

답변:


182

내가 할 일은 다음과 같습니다.

크리에이트 마이그레이션 테이블 이름 (데이터베이스 레벨)을 변경 할 수 있습니다. 나는 당신의 이전 테이블이 군단 이라고 가정합니다 . 마이그레이션 내용은 다음과 같습니다.

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

보기 폴더의 이름을 바꿉니다. 에서 corpsstores.

-> config/routes.rb와 같이 파일의 경로에서 필요한 변경을 수행 하고 코드의 모든 참조가 corps에서 stores (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에 복사하고 두 번째 및 세 번째 열에 두 번 붙여 넣습니다. 첫 번째 열에서 이름 바꾸기 명령을 추가하고 마지막 열에서 다음과 같이 새 이름으로 변경합니다.git mv ./spec/views/oldname ./spec/views/new name
Eduardo Santana

기본 목록에는 @EduardoSantana가 언급 한 새 모델 / 클래스 이름으로 테스트 파일 편집이 누락되었습니다.
user2953607

rake db:drop매우 위험합니다! 이 줄을 제거하여 "rake db : migrate"로 변경하는 것이 좋습니다! 사람들은 복사하여 붙여넣고 실행하는 경향이 있습니다!
Sagar Ranglani

10

Nobita 답변 외에도 테스트도우미 클래스 정의 및 파일 이름 corpsstore. 더 중요한 것은 당신은 변경해야합니다 corps으로 store당신의 설정 / routes.rb 파일

따라서 전체적으로 컨트롤러, 관련 모델, 뷰, 도우미, 테스트 및 경로 파일을 변경합니다.

destroy& 와 함께 제안한 generate것이 더 나은 옵션 이라고 생각합니다 . 여기에이 작업을 수행하는 방법에 대한 답변을 제공했습니다. Rails : 컨트롤러 및 해당 모델 이름 바꾸기


7

Rails 프로젝트의 모델 이름 변경 및 컨트롤러와 같은 간단한 리팩터링을위한 명령 줄 도구 인 Rails Refactor gem도 사용해 볼 수 있습니다.

용법:

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*

이름 바꾸기는 당신이 생각하는 것입니다. 우분투와 같은 다른 배포판이 같은 이름의 다른 유틸리티와 함께 ​​제공된다는 것을 알고 있습니다 ( /unix/78621/find-rename-command- 참조) 작동하지 않음). Ubuntu에서는 대신 다음을 수행합니다.

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

seed.rb 파일을 제외하고 db /에있는 파일의 이름을 바꾸지 않기를 원하므로이 디렉토리를 제외하고 수동으로 변경하는 것이 좋습니다.


5

또 다른 중요한 점은 모델 연결을 업데이트해야한다는 것입니다. 수동으로 이름을 바꾸거나 리소스를 삭제하고 생성 할 때 수행해야합니다 (다른 모델에 존재하기 때문에). 마이그레이션을 실행하여 데이터베이스에있는 외래 키의 열 이름을 변경하고 코드에서 해당 외래 키에 대한 모든 참조를 변경할 수 있습니다.

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/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

컨트롤러의 경우 수동으로 수행하는 경우 다음 위치에서 변경 해야합니다 .

  • 노선
  • 앱 / 뷰
  • 앱 / 컨트롤러
  • 테스트 / 컨트롤러
  • 앱 / 도우미
  • app / assets / javascripts /
  • 앱 / 자산 / 스타일 시트 /

모델의 경우 노비타의 대답이 꽤 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.