2017-10-18 6 views
6

मॉडल और कुछ मार्गों और नियंत्रकों के साथ a brand new Rails 5.1.4 app है।रेल का ऑटोलोडिंग/निरंतर रिज़ॉल्यूशन भूत मॉड्यूल

class AdminArea::WelcomeController < ApplicationController 
    def index 
    @user = User.new(name: 'Sergio') 
    end 
end 

अब तक तो अच्छा:

एक namespaced नियंत्रक एक शीर्ष स्तर के मॉडल संदर्भित कर रहा है। आप मास्टर को देख सकते हैं, http://localhost:3000/admin_area/welcome पर नेविगेट कर सकते हैं और इसे देख सकते हैं।

लेकिन अगर हम were to add an empty directory app/presenters/admin_area/user/ *, तो चीजें अजीब हो जाती हैं। उस नियंत्रक में अचानक, User मेरा मॉडल नहीं है, लेकिन एक गैर-मौजूदा मॉड्यूल है!

NoMethodError (undefined method `new' for AdminArea::User:Module): 

app/controllers/admin_area/welcome_controller.rb:3:in `index' 

स्वाभाविक रूप से, इस मॉड्यूल किसी भी [गैर निर्मित] विधियां नहीं हैं और डिस्क पर एक स्रोत फ़ाइल को पिन नहीं किया जा सकता है।

प्रश्न: क्यों एक खाली निर्देशिका रहस्यमय तरीके से हवा से बाहर एक मॉड्यूल जादू करने के बजाय सही ढंग से अपने मॉडल को नाम User को हल करने का कारण बनता है रेल जोड़ने?


* वास्तव में, यदि आप उस शाखा की जाँच के रूप में है, तो आप एक अलग त्रुटि प्राप्त होगी।

NameError (अप्रारंभीकृत निरंतर AdminArea :: WelcomeController :: उपयोगकर्ता)

क्योंकि Git मुझे एक खाली निर्देशिका के लिए प्रतिबद्ध नहीं जाने देंगे, तो मैं वहाँ में एक .keep फ़ाइल जोड़ा। लेकिन जैसे ही आप उस फ़ाइल को हटाते हैं, आपको ऊपर वर्णित व्यवहार मिलता है।

+0

संभावित डुप्लिकेट (https://stackoverflow.com/questions/18934115/rails-4-organize-rails-models-in-sub -पाथ-बिना-नाम-मॉडल-मॉडल) – jon1467

+0

@ जोन 1467: नहीं, उसमें से एक डुप्लिकेट नहीं। जब तक मैं कुछ याद नहीं कर रहा हूँ। –

+0

आह क्षमा करें, मुझे लगता है कि मैंने आपके प्रश्न को गलत तरीके से पढ़ा है कि निर्देशिका में 'उपयोगकर्ता' निर्देशिका में अपना उपयोगकर्ता मॉडल कैसे रखा जाए। मेरी गलती। – jon1467

उत्तर

5

यह रूबी निरंतर लुकअप का परिणाम और रेल कैसे ऑटोलोडिंग को हल करता है।

नियंत्रक में निरंतर User को "relative reference" कहा जाता है, जिसका अर्थ है कि इसे नामस्थान के सापेक्ष हल किया जाना चाहिए जिसमें यह होता है।

AdminArea::WelcomeController::User 
AdminArea::User 
User 

रेल autoloading आदेश फ़ाइल जहां निरंतर परिभाषित किया गया है खोजने के लिए फ़ाइल नाम और अधिक autoload_path रों दोहराता में इन स्थिरांक नक्शे: इस निरंतर के लिए, वहाँ तीन संभावित वेरिएंट जहां निरंतर परिभाषित किया जा सकता है। उदा .:

app/assets/admin_area/welcome_controller/user.rb 
app/assets/admin_area/welcome_controller/user 
app/channels/admin_area/welcome_controller/user.rb 
... 
app/assets/admin_area/user.rb 
app/assets/admin_area/user 
... 
app/assets/user.rb 
... 
app/models/user.rb #=> here it is! 

आप प्रस्तुतकर्ताओं निर्देशिका में admin_area/user फ़ोल्डर जोड़ते हैं, आप प्रभावी रूप से इस तरह के एक निरंतर परिभाषित कर रहे हैं। Modules in Rails are automagically created, ताकि आपको वास्तव में उन फ़ाइलों को बनाने की आवश्यकता न हो जहां आप इन मॉड्यूल को परिभाषित करते हैं जो केवल नामस्थान के रूप में काम करते हैं।

जब आप फ़ोल्डर कहा, फ़ोल्डर रेल देखने में प्रकाशित हुई:

... 
app/assets/admin_area/user.rb 
app/assets/admin_area/user 
... 
app/presenters/admin_area/user #=> Here Rails finds the folder 

और रेल User निराकरण कि मॉड्यूल को संदर्भित करने के लिए।

हालांकि इसे ठीक करने के लिए काफी आसान है, तो आप User लगातार कि एक शीर्ष स्तर लगातार (और नहीं AdminArea::User मॉड्यूल) को संदर्भित करने के AdminArea नाम स्थान के अंदर प्रयोग किया जाता है चाहते हैं, आप एक में "सापेक्ष संदर्भ" में बदल जाएगा निरंतर संदर्भ:: के साथ निरंतरता से पहले।

@user = ::User.new(name: 'Sergio') 
[रेल 4: मॉडल नेमस्पेसिंग बिना उप पथ में रेल मॉडल का आयोजन] की
+0

एकमात्र गायब टुकड़ा, मुझे लगता है, कोड से लिंक है जो स्वचालित रूप से मॉड्यूल बनाता है। –

+1

वहां आप http://guides.rubyonrails.org/autoloading_and_reloading_constants.html#automatic-modules :) "अगर autoload_paths में एक फ़ाइल है जिसे admin.rb रेल कहा जाता है, तो उसे लोड करने जा रहा है, लेकिन अगर ऐसी कोई फ़ाइल नहीं है और कोई व्यवस्थापक नामक निर्देशिका पाया जाता है, रेल एक खाली मॉड्यूल बनाता है और इसे फ्लाई पर व्यवस्थापक स्थिरांक को असाइन करता है। " –

+0

यह है, धन्यवाद! जैसे ही यह मुझे देता है मैं बक्षीस का पुरस्कार दूंगा :) –

संबंधित मुद्दे