ruby on rails - एक परियोजना में रेल नियंत्रक और मॉडल का नाम कैसे बदलें




ruby-on-rails model (6)

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

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

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

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


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

उपयोग:

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

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

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

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

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

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

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

  • नियंत्रक वर्ग फ़ाइल में नियंत्रक कार्रवाई का नाम बदलता है
  • नाम सभी प्रारूपों के लिए फाइलें देखें

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

  • फ़ाइल में मॉडल फ़ाइल और वर्ग का नाम बदलता है
  • फाइल में spec फ़ाइल और वर्ग का नाम बदलता है
  • फाइल में माइग्रेशन और क्लास नाम और टेबल नाम का नाम बदलता है

...


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

rename_column :table, :old_id, :new_id

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

belongs_to :new, foreign_key: "old_id"

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


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

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

  1. db/migrate फ़ोल्डर में Stores/Store में Corps/Corp शामिल सभी फ़ाइलों (नाम और सामग्री) को बदलें
  2. चलाने की कोशिश करें:

    रेक डीबी: ड्रॉप: सब

    रेक डीबी: बनाएँ

    रेक डीबी: माइग्रेट करें

  3. db/seeds.rb फ़ाइल की सामग्री बदलें।

  4. चलाने की कोशिश करें: rake db:seed --trace (इस चरण में आपको कुछ अन्य मॉडल / नियंत्रक फ़ाइलों को बदलने की आवश्यकता हो सकती है।)
  5. test/fixtures फ़ाइलों को बदलें। आपको न केवल corps.yml को बदलने की आवश्यकता हो सकती है लेकिन अन्य संबंधित फाइलें (कुछ फ़ाइलों में corp_id शामिल हो सकता है)।
  6. अपने परीक्षण चलाने की कोशिश करें, इसे निश्चित बीज के साथ चलाने के लिए बेहतर है (जोड़ें: TESTOPTS="--seed=1981" या कोई अन्य नंबर)
  7. फ़ाइलों (नाम और सामग्री) का नाम बदलें सावधान रहें कभी-कभी आपको परीक्षण और अन्य ऐप फ़ाइल को बदलने की आवश्यकता होती है

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

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

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


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

एकवचन, शून्य और मायास:

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*

नाम बदलें कि आप क्या सोचते हैं, हालांकि, मुझे उबंटू जैसे अन्य वितरणों को एक ही नाम की एक अलग उपयोगिता के साथ शिप करने के लिए जाना जाता है ( https://unix.stackexchange.com/questions/78621/find-rename-command-doesnt-work )। उबंटू पर आप इसके बजाय ऐसा करेंगे:

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

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


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

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

class RenameCorpsToStores < ActiveRecord::Migration
  def change
    rename_table :corps, :stores
  end
end

अपना मॉडल फ़ाइल नाम, अपनी मॉडल श्रेणी परिभाषा और मॉडल एसोसिएशन बदलें:

  • फ़ाइल का नाम बदलें: corp.rb -> store.rb
  • store.rb कोड: class Store लिए class Store class Corp बदलें
  • has_many :corps जैसे सभी मॉडल एसोसिएशन का नाम बदलें has_many :corps -> has_many :stores

अपना कंट्रोलर फ़ाइल नाम और अपनी कंट्रोलर क्लास परिभाषा बदलें:

  • फ़ाइल का नाम बदलें: corps_controller.rb -> stores_controller.rb
  • stores_controller.rb कोड: class CorpsController लिए class StoresController class CorpsController बदलें

विचार फ़ोल्डर का नाम बदलें। corps से stores

config/routes.rb फ़ाइल में पथों में आवश्यक परिवर्तन करें, जैसे resources :corps -> resources :stores , और सुनिश्चित करें कि कोड में सभी संदर्भ कोर से स्टोर में बदल जाते हैं (corps_path, ...)

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

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

 $ rake db:drop db:create db:migrate




rename