วิธีเปลี่ยนชื่อตัวควบคุมรางและรุ่นในโครงการ


93

ฉันเริ่มแอป Rails และทุกอย่างทำงานได้ดี แต่ตอนนี้ฉันต้องการเปลี่ยนชื่อคอนโทรลเลอร์และรุ่นที่เกี่ยวข้อง:

ฉันต้องการเปลี่ยนCorpsคอนโทรลเลอร์เป็นStoresและแบบเดียวกัน (โดยไม่มีขั้นสุดท้าย) สำหรับโมเดล

เมื่อค้นหาใน Google มีคนแนะนำให้ทำลายแล้วสร้างคอนโทรลเลอร์และโมเดลอีกครั้ง ปัญหาคือมันจะลบรหัสจริงของแต่ละไฟล์!

วิธีแก้ปัญหาใด ๆ ขอบคุณล่วงหน้า.

คำตอบ:


183

นี่คือสิ่งที่ฉันจะทำ:

สร้างการย้ายข้อมูลเพื่อเปลี่ยนชื่อตาราง (ระดับฐานข้อมูล) ผมถือว่าตารางเก่าของคุณเรียกว่ากองกำลัง เนื้อหาการย้ายจะเป็น:

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 เป็นร้านค้า (corps_path, ... )

อย่าลืมเรียกใช้การย้ายข้อมูล :)

หากไม่สามารถทำได้ก่อนหน้านี้ให้ลองลบ db / schema.rb และดำเนินการ:

 $ rake db:drop db:create db:migrate

2
อาจต้องการพูดถึงการเปลี่ยน config / route.rb เพื่อชี้ทุกเส้นทาง: corps ไปที่: store
route

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

นอกเหนือไปจากคำตอบในทำนองเดียวกันโนบิตะคุณต้องเปลี่ยนการทดสอบและผู้ช่วยระดับคำจำกัดความและชื่อแฟ้มสำหรับการ corps ที่สำคัญคุณควรเปลี่ยนเป็นไฟล์config / route.rbของคุณstorecorpsstore

ดังนั้นโดยรวมแล้วคุณกำลังทำการเปลี่ยนแปลงในตัวควบคุมไฟล์โมเดลมุมมองผู้ช่วยเหลือการทดสอบและเส้นทางที่เกี่ยวข้อง

ฉันคิดว่าสิ่งที่คุณเห็นแนะนำdestroy& generateเป็นตัวเลือกที่ดีกว่า ฉันได้ให้คำตอบว่าต้องทำอย่างไรที่นี่: Rails: การเปลี่ยนชื่อตัวควบคุมและโมเดลที่เกี่ยวข้อง


7

คุณสามารถลองใช้Rails Refactor gem ซึ่งเป็นเครื่องมือบรรทัดคำสั่งสำหรับ refactors ง่ายๆเช่นเปลี่ยนชื่อโมเดลและคอนโทรลเลอร์สำหรับโปรเจ็กต์ Rails

การใช้งาน:

การเปลี่ยนชื่อและการปรับโครงสร้างพื้นฐานสำหรับโครงการราง แม้ว่าสิ่งเหล่านี้จะไม่สมบูรณ์แบบ แต่ก็จะทำงานให้คุณได้มากและประหยัดเวลา

ก่อนใช้งานแนะนำให้คุณเริ่มจากสถานะที่เก็บที่สะอาดเพื่อให้คุณตรวจสอบการเปลี่ยนแปลงได้อย่างง่ายดาย

ติดตั้ง:
gem install rails_refactor

ก่อนใช้งานตรวจสอบให้แน่ใจว่าคุณcd ไปที่รูทของโครงการราง

ในการเปลี่ยนชื่อคอนโทรลเลอร์:
rails_refactor rename OldController NewController

  • เปลี่ยนชื่อไฟล์คอนโทรลเลอร์และชื่อคลาสในไฟล์
  • เปลี่ยนชื่อไฟล์ข้อมูลจำเพาะคอนโทรลเลอร์และชื่อคลาสในไฟล์
  • เปลี่ยนชื่อดูไดเร็กทอรี
  • เปลี่ยนชื่อไฟล์ตัวช่วยและชื่อโมดูลในไฟล์
  • อัปเดตเส้นทาง

ในการเปลี่ยนชื่อแอ็คชันคอนโทรลเลอร์:
$ rails_refactor rename DummyController.old_action new_action

  • เปลี่ยนชื่อแอ็คชันคอนโทรลเลอร์ในไฟล์คลาสคอนโทรลเลอร์
  • เปลี่ยนชื่อดูไฟล์สำหรับทุกรูปแบบ

ในการเปลี่ยนชื่อรุ่น:
$ rails_refactor rename OldModel NewModel

  • เปลี่ยนชื่อไฟล์โมเดลและชื่อคลาสในไฟล์
  • เปลี่ยนชื่อไฟล์ข้อมูลจำเพาะและชื่อคลาสในไฟล์
  • เปลี่ยนชื่อการย้ายและชื่อคลาสและชื่อตารางในไฟล์

...


6

ฉันเพิ่มเติมจากคำตอบของโนบิตะ (ซึ่งฉันจะแสดงความคิดเห็นว่าฉันมีตัวแทนเพียงพอหรือไม่) หากคุณรู้สึกกล้าหาญการเปลี่ยนแปลงชื่อไฟล์และการอ้างอิงถึงโมเดลในโค้ดของคุณอาจเป็นไปโดยอัตโนมัติบ้าง ตัวอย่างเช่นหากต้องการเปลี่ยนการอ้างอิงในรหัสของคุณคุณสามารถใช้ได้

เอกพจน์ลบและ Mayus:

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) ซึ่งจะช่วยคุณเปลี่ยนชื่อไฟล์:

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

ตรวจสอบการเปลี่ยนชื่อเป็นสิ่งที่คุณคิด แต่ฉันรู้จักการกระจายอื่น ๆ เช่น Ubuntu เพื่อจัดส่งด้วยยูทิลิตี้อื่นที่มีชื่อเดียวกัน (ดู/unix/78621/find-rename-command- ไม่ทำงาน ) บน Ubuntu คุณจะทำสิ่งนี้แทน:

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

โปรดทราบว่าคุณต้องการหลีกเลี่ยงการเปลี่ยนชื่อไฟล์ใด ๆ ใน db / ยกเว้นในไฟล์ seeds.rb ของคุณดังนั้นคุณอาจต้องการยกเว้นไดเร็กทอรีนี้และทำการเปลี่ยนแปลงด้วยตนเอง


5

สิ่งที่สำคัญอีกประการหนึ่งคือคุณต้องอัปเดตการเชื่อมโยงโมเดลซึ่งคุณจะต้องทำไม่ว่าคุณจะเปลี่ยนชื่อด้วยตนเองหรือทำลายและสร้างทรัพยากร (เนื่องจากมีอยู่ในโมเดลอื่น ๆ ) คุณสามารถเรียกใช้การย้ายข้อมูลเพื่อเปลี่ยนชื่อคอลัมน์ของคีย์ต่างประเทศในฐานข้อมูลและเปลี่ยนการอ้างอิงทั้งหมดไปยังคีย์ต่างประเทศในรหัส:

rename_column :table, :old_id, :new_id

หรือตั้งค่าคีย์ต่างประเทศที่กำหนดเองเมื่อประกาศการเชื่อมโยงที่ใช้คีย์ต่างประเทศเก่า:

belongs_to :new, foreign_key: "old_id"

นอกจากนี้หากทรัพยากรของคุณมีรูปภาพรูปภาพเหล่านี้มักจะถูกเก็บไว้ในไดเร็กทอรีที่มีชื่อทรัพยากร แต่ (อย่างน้อยก็มีคลื่นพาหะ) เมื่อเปลี่ยนชื่อทรัพยากรแล้วจะมีการอ้างอิงอย่างไม่ถูกต้อง (ไฟล์อยู่ที่ '/ uploads / old / image / 1 / pic.jpg 'แต่ค้นหาที่' uploads / new / ... ') ดังนั้นคุณจะต้องลบและอัปโหลดภาพใหม่ย้ายไปยังเส้นทางใหม่หรืออาจเปลี่ยนตำแหน่ง กำลังถูกมองหา


0

และหากคุณมีการทดสอบโมเดลคุณต้องเปลี่ยน:

การเปลี่ยนชื่อไฟล์: corp_test.rb -> store_test.rb (สำหรับการทดสอบคอนโทรลเลอร์การทดสอบการรวมการติดตั้งและอื่น ๆ )

รหัสของ store_test.rb: เปลี่ยนคลาส CorpTest สำหรับคลาส StoreTest

และการอ้างอิงทั้งหมดของ corp ในคอนโทรลเลอร์โมเดลการรวมการทดสอบฟิกซ์เจอร์


0

ในฐานะคนที่เพิ่งทำกระบวนการที่เจ็บปวดนี้ให้เสร็จขั้นตอนที่สำคัญที่สุดคือสร้างTESTSให้เพียงพอเพื่อตรวจสอบฟังก์ชันการทำงานให้ได้มากที่สุด ควรครอบคลุมไม่เพียง แต่รุ่น / คอนโทรลเลอร์ที่คุณวางแผนจะเปลี่ยนชื่อ แต่ยังรวมถึงโมเดล / คอนโทรลเลอร์ / มุมมองอื่น ๆ ทั้งหมดด้วย อย่างไรก็ตามมันเป็นการฝึกฝนที่ดี (หรืออาจถึงขั้นต้อง)

ทำตามขั้นตอนนี้โดยการทำซ้ำบางครั้งคุณต้องกลับมาที่ขั้นตอนสองสามครั้ง (5 ขึ้นไป) เพื่อค้นหาไฟล์เพิ่มเติมที่จำเป็นต้องเปลี่ยนแปลง และตอนนี้สำหรับขั้นตอนการเปลี่ยนชื่อ:

  1. เปลี่ยนไฟล์ทั้งหมด (ชื่อและเนื้อหา) โฟลเดอร์include Corps/Corpto Stores/Storeindb/migrate
  2. ลองเรียกใช้:

    คราด db: drop: all

    คราดฐานข้อมูล: สร้าง

    คราดฐานข้อมูล: โยกย้าย

  3. เปลี่ยนเนื้อหาของdb/seeds.rbไฟล์

  4. ลองรัน: rake db:seed --trace(ในขั้นตอนนี้คุณอาจต้องเปลี่ยนไฟล์โมเดล / คอนโทรลเลอร์อื่น ๆ )
  5. เปลี่ยนtest/fixturesไฟล์ คุณอาจต้องเปลี่ยนไม่เพียง แต่ corps.yml เท่านั้น แต่ยังรวมถึงไฟล์อื่น ๆ ที่เกี่ยวข้องด้วย (บางไฟล์อาจรวมถึง corp_id)
  6. พยายามเรียกใช้การทดสอบของคุณจะดีกว่าที่จะรันด้วยเมล็ดพันธุ์คงที่ (เพิ่ม: TESTOPTS="--seed=1981"หรือหมายเลขอื่น ๆ )
  7. เปลี่ยนชื่อเป็นไฟล์ (ชื่อและเนื้อหา) ระวังบางครั้งคุณต้องเปลี่ยนไฟล์ทดสอบและไฟล์แอพอื่น ๆ

0

สำหรับคอนโทรลเลอร์คุณจะต้องทำการเปลี่ยนแปลงในตำแหน่งต่อไปนี้หากคุณทำด้วยตนเอง :

  • เส้นทาง
  • แอป / มุมมอง
  • แอพ / คอนโทรลเลอร์
  • ทดสอบ / ตัวควบคุม
  • แอป / ตัวช่วย
  • แอป / สินทรัพย์ / จาวาสคริปต์ /
  • แอป / ทรัพย์สิน / สไตล์ชีต /

สำหรับนางแบบคำตอบของโนบิตะค่อนข้างดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.