Rails 앱을 시작했고 모든 것이 잘 작동합니다. 하지만 이제 컨트롤러와 관련 모델의 이름을 바꾸고 싶습니다.
나는 Corps
컨트롤러를 Stores
(최종 s없이) 로 변경하고 싶었습니다 .
Google에서 사람들은 컨트롤러와 모델을 파괴 한 다음 다시 생성 할 것을 제안했습니다. 문제는 각 파일의 실제 코드가 지워진다는 것입니다!
어떤 해결책이 있습니까? 미리 감사드립니다.
답변:
내가 할 일은 다음과 같습니다.
크리에이트 마이그레이션 테이블 이름 (데이터베이스 레벨)을 변경 할 수 있습니다. 나는 당신의 이전 테이블이 군단 이라고 가정합니다 . 마이그레이션 내용은 다음과 같습니다.
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에서 stores (corps_path, ...)로 변경되는지 확인하십시오.resources :corps
resources :stores
마이그레이션을 실행해야합니다. :)
이전이 불가능한 경우 db / schema.rb를 삭제하고 다음을 실행하십시오.
$ rake db:drop db:create db:migrate
find -name "oldname_on_singular?*
이름을 바꿀 파일 목록을 얻기 위해 실행 합니다. 그런 다음 calc에 복사하고 두 번째 및 세 번째 열에 두 번 붙여 넣습니다. 첫 번째 열에서 이름 바꾸기 명령을 추가하고 마지막 열에서 다음과 같이 새 이름으로 변경합니다.git mv ./spec/views/oldname ./spec/views/new name
rake db:drop
매우 위험합니다! 이 줄을 제거하여 "rake db : migrate"로 변경하는 것이 좋습니다! 사람들은 복사하여 붙여넣고 실행하는 경향이 있습니다!
Nobita 답변 외에도 테스트 및 도우미 클래스 정의 및 파일 이름 corps
을 store
. 더 중요한 것은 당신은 변경해야합니다 corps
으로 store
당신의 설정 / routes.rb 파일
따라서 전체적으로 컨트롤러, 관련 모델, 뷰, 도우미, 테스트 및 경로 파일을 변경합니다.
destroy
& 와 함께 제안한 generate
것이 더 나은 옵션 이라고 생각합니다 . 여기에이 작업을 수행하는 방법에 대한 답변을 제공했습니다. Rails : 컨트롤러 및 해당 모델 이름 바꾸기
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
- 모델 파일 및 파일의 클래스 이름을 바꿉니다.
- 사양 파일 및 파일의 클래스 이름을 바꿉니다.
- 마이그레이션 및 클래스 이름 및 파일의 테이블 이름을 바꿉니다.
...
나는 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 /에있는 파일의 이름을 바꾸지 않기를 원하므로이 디렉토리를 제외하고 수동으로 변경하는 것이 좋습니다.
또 다른 중요한 점은 모델 연결을 업데이트해야한다는 것입니다. 수동으로 이름을 바꾸거나 리소스를 삭제하고 생성 할 때 수행해야합니다 (다른 모델에 존재하기 때문에). 마이그레이션을 실행하여 데이터베이스에있는 외래 키의 열 이름을 변경하고 코드에서 해당 외래 키에 대한 모든 참조를 변경할 수 있습니다.
rename_column :table, :old_id, :new_id
또는 이전 외래 키를 사용하는 연결을 선언 할 때 사용자 지정 외래 키를 설정합니다.
belongs_to :new, foreign_key: "old_id"
또한 리소스에 이미지가 포함되어있는 경우 리소스 이름이 포함 된 디렉토리에 저장되지만 (적어도 carrierwave 포함) 리소스 이름이 변경되면 잘못 참조됩니다 (파일은 '/ uploads / old / image /에 있음). 1 / pic.jpg '이지만'uploads / new / ... '에서 찾을 수 있으므로 이미지를 삭제하고 다시 업로드하거나 새 경로로 이동하거나 위치를 변경해야합니다.' 다시 찾고 있습니다.
모델 테스트가있는 경우 다음을 변경해야합니다.
파일 이름 변경 : corp_test.rb-> store_test.rb (컨트롤러 테스트, 통합 테스트, 고정 장치 등에도 해당)
store_test.rb 코드 : StoreTest 클래스의 CorpTest 클래스를 변경하십시오.
그리고 컨트롤러, 모델, 통합, 픽스처 테스트에서 corp의 모든 참조.
이 고통스러운 과정을 막 끝내는 사람으로서 가장 중요한 단계는 충분한 테스트 를 구축하는 것입니다. 가능한 한 많은 기능을 확인 를 하는 것입니다. 이름을 변경하려는 모델 / 컨트롤러뿐만 아니라 다른 모든 모델 / 컨트롤러 / 뷰 부품도 포함해야합니다. 어쨌든 그것은 좋은 (또는 아마도 필수) 연습입니다.
이 단계를 반복하여 수행하십시오. 때때로 변경해야하는 추가 파일을 찾기 위해 몇 번 (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"
또는 다른 숫자) 로 실행하는 것이 좋습니다.