कैसे एक परियोजना में रेल और मॉडल का नाम बदलें


91

मैंने एक रेल एप्लिकेशन शुरू किया और सब कुछ ठीक काम करता है। लेकिन अब, मैं एक नियंत्रक और संबंधित मॉडल का नाम बदलना चाहूंगा:

मैं मॉडल के लिए Corpsनियंत्रक Storesऔर उसी (अंतिम एस के बिना) को बदलना चाहता था ।

Google को देखते हुए, लोगों ने नष्ट करने और फिर से नियंत्रक और मॉडल बनाने का सुझाव दिया। समस्या यह है कि यह प्रत्येक फ़ाइलों के वास्तविक कोड को मिटा देगा!

कोई भी समाधान? अग्रिम में धन्यवाद।

जवाबों:


181

यहां है जो मुझे करना होगा:

तालिका नाम (डेटाबेस स्तर) को बदलने के लिए माइग्रेशन बनाएं । मुझे लगता है कि आपकी पुरानी तालिका को कॉर्प्स कहा जाता है । प्रवास सामग्री होगी:

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_path, ...) में बदल दें।

माइग्रेशन चलाना याद रखें :)

यदि पिछला संभव नहीं है, तो db / schema.rb को हटाने और निष्पादित करने का प्रयास करें:

 $ rake db:drop db:create db:migrate

2
सभी प्रकार को इंगित करने के लिए कॉन्फ़िगर / मार्गों को बदलने के लिए उल्लेख करना चाह सकते हैं: कोर मार्गों को: स्टोर मार्गों
tgf

1
मैं find -name "oldname_on_singular?*नाम बदलने के लिए फाइलों की सूची प्राप्त करने के लिए दौड़ता हूं । फिर मैंने इसे कैल्क पर कॉपी किया, दूसरे और तीसरे कॉलम पर दो बार पेस्ट किया। पहले कॉलम में मैं नाम बदलकर कमांड जोड़ता हूं और आखिरी कॉलम में मैं नए नाम के लिए कुछ इस तरह से बदलता हूं:git mv ./spec/views/oldname ./spec/views/new name
एडुआर्डो सैन्टाना

मुख्य सूची @EduardoSantana द्वारा उल्लिखित नए मॉडल / वर्ग के नाम के साथ परीक्षण फ़ाइलों को संपादित करने में गायब है।
user2953607

10

नोबिता जवाब के अलावा आपको इसी तरह टेस्ट और हेल्पर वर्ग की परिभाषाएँ और फ़ाइल नाम बदलने की आवश्यकता corpsहै storeअधिक महत्वपूर्ण बात आप बदलना चाहिए corpsकरने के लिए storeअपने में config / routes.rb फ़ाइल

इसलिए कुल मिलाकर आप कंट्रोलर, संबद्ध मॉडल, दृश्य, हेल्पर्स, टेस्ट और रूट फ़ाइलों में बदलाव कर रहे हैं।

मुझे लगता है कि आप के साथ सुझाव दिया देखा गया है destroyऔर generateएक बेहतर विकल्प है। मैंने एक उत्तर दिया है कि यह कैसे किया जाए: रेल: एक नियंत्रक और संबंधित मॉडल का नाम बदलना


7

आप रेल रिफैक्टर मणि को भी आज़मा सकते हैं, रेल रिफ्लेक्टर जैसे सरल रिफ्लेक्टर के लिए एक कमांड लाइन उपकरण और रेल परियोजनाओं के लिए नियंत्रक

उपयोग:

रेल परियोजनाओं के लिए बुनियादी नाम और रिफ्लेक्टरिंग। हालाँकि ये सही नहीं हैं, फिर भी ये आपके लिए बहुत काम करेंगे और आपका समय बचाएंगे।

उपयोग करने से पहले, अनुशंसा करें कि आप एक स्वच्छ भंडार राज्य से शुरू करते हैं ताकि आप आसानी से परिवर्तनों की समीक्षा कर सकें।

स्थापित करने के लिए:
gem install rails_refactor

उपयोग करने से पहले, सुनिश्चित करें कि आप अपने रेल परियोजना की जड़ में cd करते हैं।

एक नियंत्रक का नाम बदलने के लिए:
rails_refactor rename OldController NewController

  • फ़ाइल में नियंत्रक फ़ाइल और वर्ग नाम का नाम
  • फ़ाइल में नियंत्रक युक्ति और फ़ाइल नाम का नाम बदलें
  • नाम निर्देशिका देखें
  • फ़ाइल में सहायक फ़ाइल का नाम और मॉड्यूल का नाम
  • अद्यतन मार्ग

नियंत्रक क्रिया का नाम बदलने के लिए:
$ rails_refactor rename DummyController.old_action new_action

  • कंट्रोलर क्लास फाइल में कंट्रोलर एक्शन का नाम बदल देता है
  • सभी प्रारूपों के लिए नाम बदलने की फाइलें

एक मॉडल का नाम बदलने के लिए:
$ rails_refactor rename OldModel NewModel

  • मॉडल का नाम और फ़ाइल में वर्ग का नाम
  • फ़ाइल में कल्पना फ़ाइल और कक्षा का नाम
  • फ़ाइल में माइग्रेशन और श्रेणी नाम और तालिका नाम का नाम बदल देता है

...


6

मैं नोबिता के जवाब के अलावा (जो मैं पर्याप्त प्रतिनिधि होने पर टिप्पणी करूंगा), अगर आप बहादुर महसूस कर रहे हैं तो आपके कोड में मॉडल के फाइलनाम और संदर्भों में परिवर्तन को कुछ हद तक स्वचालित किया जा सकता है। उदाहरण के लिए, अपने कोड में संदर्भ बदलने के लिए आप इसका उपयोग कर सकते हैं

एकवचन, माइनस और मेयस:

grep -rl corp | xargs sed -i 's/corp/store/g'
grep -rl Corp | xargs sed -i 's/Corp/Store/g'

बहुवचन, माइनस और मेयस (एकवचन बहुवचन की जगह लेता है, यदि बहुवचन केवल जरूरतों और अंत में चरित्र है):

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}' {} \;

और कुछ नामी फ्लेवर (स्लैकवेयर सहित) पर नाम बदलने की उपयोगिता है जो आपको फाइलों का नाम बदलने में मदद करेगी:

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

नाम बदलें वह है जो आपको लगता है कि यह है, हालांकि, मैंने अन्य वितरणों को एक ही नाम की एक अलग उपयोगिता के साथ जहाज करने के लिए Ubuntu की तरह जाना है (देखें /unix/78621/find-rename-command- काम नहीं करता )। उबंटू पर आप इसके बजाय ऐसा करेंगे:

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

ध्यान दें कि आप अपने सीड्सबीआरबी फ़ाइल में संभवतः db / को छोड़कर किसी भी फाइल का नाम बदलने से बचना चाहते हैं, इसलिए आप संभवतः इस निर्देशिका को छोड़कर मैन्युअल रूप से कोई भी परिवर्तन करना चाहते हैं।


5

एक अन्य महत्वपूर्ण बात यह है कि आपको मॉडल संघों को अपडेट करने की आवश्यकता है, जो आपको करना होगा कि क्या आप मैन्युअल रूप से नाम बदलें या संसाधन को नष्ट करें (क्योंकि वे अन्य मॉडल में मौजूद हैं)। आप डेटाबेस में विदेशी कुंजी के कॉलम नामों को बदलने के लिए माइग्रेशन चला सकते हैं और कोड में उन विदेशी कुंजी के सभी संदर्भ बदल सकते हैं:

rename_column :table, :old_id, :new_id

या पुरानी विदेशी कुंजी का उपयोग करने वाले संघ की घोषणा करते समय एक कस्टम विदेशी कुंजी सेट करें:

belongs_to :new, foreign_key: "old_id"

यदि आपके संसाधन में चित्र शामिल हैं, तो उन्हें अक्सर एक निर्देशिका में संग्रहीत किया जाता है जिसमें संसाधन का नाम शामिल होता है (लेकिन कम से कम वाहक के साथ) संसाधन के नाम को बदलने के बाद उन्हें गलत तरीके से संदर्भित किया जाएगा (फाइल / अपलोड / पुरानी / छवि में मौजूद है) 1 / pic.jpg 'लेकिन' अपलोड / नया / ... ') के लिए देखा जाता है, इसलिए आपको छवियों को हटाना या फिर से अपलोड करना होगा, उन्हें नए पथ पर ले जाना होगा, या शायद वे जहां बदलेंगे' फिर से देखा जा रहा है


0

और यदि आपके पास मॉडल परीक्षण हैं, तो आपको बदलने की आवश्यकता है:

फ़ाइल का नाम: corp_test.rb -> store_test.rb (नियंत्रक परीक्षण, एकीकरण परीक्षण, स्थिरता, आदि के लिए भी)

Store_test.rb का कोड: क्लास स्टोरटेस्ट के लिए वर्ग कॉर्पटेस्ट बदलें।

और नियंत्रक, मॉडल, एकीकरण, स्थिरता परीक्षणों में कॉर्प के सभी संदर्भ।


0

जैसा कि कोई है कि इस दर्दनाक प्रक्रिया को समाप्त करने के लिए सबसे महत्वपूर्ण कदम यह है कि संभव के रूप में अधिक कार्यक्षमता की जांच करने के लिए पर्याप्त TESTS का निर्माण करना है। उन्हें न केवल उस मॉडल / नियंत्रक को कवर करना चाहिए जिसे आप नाम बदलने की योजना बनाते हैं बल्कि अन्य सभी मॉडल / नियंत्रक / दृश्य भागों को भी शामिल करते हैं। किसी भी तरह यह एक अच्छा (या शायद एक भी) अभ्यास है।

पुनरावृत्तियों द्वारा यह कदम उठाएं, कभी-कभी आपको अतिरिक्त फ़ाइलों की खोज करने के लिए कुछ समय (5 और अधिक) के चरणों में वापसी करने की आवश्यकता होती है जिन्हें बदलने की आवश्यकता होती है। और अब नाम बदलने के लिए कदम:

  1. सभी फाइलें (नाम और सामग्री) शामिल बदले Corps/Corpकरने Stores/Storeमें db/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

नियंत्रक के लिए आपको निम्नलिखित स्थानों में परिवर्तन करना होगा यदि आप इसे मैन्युअल रूप से कर रहे हैं :

  • मार्ग
  • एप्लिकेशन / विचारों
  • एप्लिकेशन / नियंत्रकों
  • परीक्षा / नियंत्रकों
  • एप्लिकेशन / सहायक
  • एप्लिकेशन / आस्तियों / javascripts /
  • एप्लिकेशन / आस्तियों / स्टाइलशीट /

मॉडल के लिए, नोबिता का जवाब बहुत अच्छा है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.