2011-02-07 16 views
6

मैं कहाँ उन टेम्पलेट्स के एक नंबर से एक का चयन और एक छोटे से वेबसाइट का निर्माण कर सकते एक रेल 3 एप्लिकेशन बनाने रहा हूँ में प्रारंभकर्ता। जब एप्लिकेशन शुरू होता है तो मैं सभी उपलब्ध टेम्पलेट्स को प्रारंभ करने की कोशिश कर रहा हूं। यही कारण है कि अनिवार्य रूप से एक फ़ाइल है कि चलो मुझे उन सब को परिभाषित है, तो उनमें से हर एक, जो बारी में दुकानों उन्हें @@templates में के लिए Template.add(template) कॉल करता है और मैं Template.find(name) से उन तक पहुँच सकते हैं।पुनः लोड रेल 3 विकास मोड

समस्या यह है कि विकास मोड में, शुरुआती उपयोगकर्ता ने Template.add पर कॉल कर रहे हैं, पहले अनुरोध पर लोड हो रहे हैं, फिर reload! पर मिटा दिया गया। मैं config.to_prepare के बारे में पढ़ा है, लेकिन यह मेरे लिए काम नहीं कर रहा है, संभावना है क्योंकि मैं इस तरह टेम्पलेट्स की आवश्यकता होती है हूँ:

# template config at app/templates/template_name/template_name.rb 
path = File.expand_path(Rails.root + 'app/templates') 
Dir[File.join(path, '/*')].each do |template| 
    name = File.basename(template) 
    require File.join(path, name, "#{name}.rb") 
end 

क्या मैं या तो reload! के बाद इन फ़ाइलों को लोड करने या उन्हें हो रहा से रखने के लिए कर सकते बिल्कुल दुर्घटनाग्रस्त हो गया? इसके अलावा, अगर आपके पास इसे संभालने के बेहतर तरीके की सिफारिश है, तो मैं सभी कान हूं। मैं अभी भी रेल के साथ अपना पैर प्राप्त कर रहा हूं, खासकर कॉन्फ़िगरेशन सामान के संबंध में।

मैं अस्थायी रूप से कक्षा में डेटा लोड हो रहा करके इस समस्या से बचने कर रहा हूँ। मुझे इस बदसूरत, गैर-मॉड्यूलर नास्टनेस से बचाओ।

+0

मुझे यकीन नहीं है कि मुझे आपका प्रश्न मिला है। तो बस एक सुझाव: आप अपनी फाइलों को ऑटोलोड क्यों नहीं करते? http: // hemju।कॉम/2010/09/22/रेल-3-क्विकटिप-ऑटोलोड-lib-directory-सहित-all-subdirectories/ – apneadiving

+0

प्रक्रिया के साथ परिचितता की कमी, वास्तव में, लेकिन यह मेरी समस्या को किसी भी तरह हल नहीं करती है। टेम्पलेट मॉडल को प्रत्येक अनुरोध (cache_classes = विकास में झूठा) पर पुनः लोड किया जा रहा है और मेरी टेम्पलेट फ़ाइलों को फिर से लोड नहीं किया जाएगा, इसलिए दूसरे अनुरोध पर टेम्पलेट मॉडल के साथ कोई टेम्पलेट "पंजीकृत" नहीं है। – coreyward

+0

क्या आप सोच सकते हैं कि यह क्यों लगता है कि यह to_prepare के साथ काम नहीं कर रहा है? – johnmcaliley

उत्तर

1

मुझे लगता है कि आप अगर आप सिर्फ बाद requiretemplate_name.rb फाइलों से बाहर Template.add करने के लिए अपने कॉल के लिए कदम (मुझे लगता है कि वह जगह है जहाँ वे अब कर रहे हैं रहा हूँ), और अपने कोड डालने में, config.to_prepare के साथ ऐसा करने में सक्षम होना चाहिए । उदाहरण के लिए, अपने टेम्पलेट वर्ग के लिए इस वर्ग विधि जोड़ने पर विचार करें, और उसके बाद भी हो सकता है वर्ग में ही जब वह पहली बार लोड हो जाता है से यह बुला:

class Template 
    def self.load_all 
    # template config at app/templates/template_name/template_name.rb 
    path = File.expand_path(Rails.root + 'app/templates') 
    Dir[File.join(path, '/*')].each do |template| 
     name = File.basename(template) 
     require File.join(path, name, "#{name}.rb") 

     # Register the template even if the class itself is already loaded. 
     Template.add(name) 
    end 
    end 

    # Initially load all templates. 
    Template.load_all 
end 

फिर template_name.rb फ़ाइलों जहां वे खुद को पंजीकृत कर रहे हैं से Template.add(name) कोड को दूर । (दोबारा, मुझे लगता है कि यह वह जगह है जहां वर्तमान में होता है - मैं इस पर आपकी मूल पोस्ट से बिल्कुल स्पष्ट नहीं हूं।) या शायद आप यह सुनिश्चित करना चाहते हैं कि Template.add बेवकूफ है और चुपचाप डुप्लिकेट छोड़ देता है।

अन्त में, जोड़ने config/environments/development.rb के लिए निम्न:

config.to_prepare do 
    Template.load_all 
end 

कि Template वर्ग पुनः लोड के बाद अपने सभी टेम्पलेट्स को फिर से लोड होगा।

मैंने यह कोशिश नहीं की है, लेकिन Template.load_all पर कॉल के साथ मैंने Template कक्षा के अंत में सुझाव दिया है, आपको config.to_prepare भाग की भी आवश्यकता नहीं हो सकती है।

+0

मुझे इस समस्या के दौरान 'config.to_prepare' के बारे में पता नहीं था और मैंने इसे पोस्ट करने के बाद इसके बारे में बहुत कुछ नहीं सोचा है, लेकिन मुझे लगता है * यह मेरे लिए काफी अच्छा काम करेगा। जब मैं समय लेता हूं और स्वीकार करता हूं तो मैं इसे छोड़ दूंगा। – coreyward

1

मेमोरीड या रेडिस, या यहां तक ​​कि डेटाबेस में मेमोरी स्टोर में टेम्पलेट नामों की लुकअप को संग्रहीत करने के बारे में कैसे। प्रारंभकर्ता मेमोरी स्टोर को लोड कर सकता है या यह सुनिश्चित कर सकता है कि डेटाबेस सभी मानों के साथ अद्यतित है, और फिर Template.find यह देखने के लिए स्टोर को देख सकता है कि फाइल कहां हैं, या यहां तक ​​कि क्लास नाम भी प्राप्त हो रहा है अगर वे पहले से ही जा रहे हैं लोड किया जाना है। बस यह देखकर कि कक्षा का नाम परिभाषित किया गया है, आपको बता सकता है कि आपको टेम्पलेट फ़ाइल की आवश्यकता है या बस आगे बढ़ें और अपना नया उदाहरण बनाएं।

मूल रूप से रेल प्रक्रिया प्रक्रिया मेमोरी के बाहर @@templates स्टोर करें, या कम से कम पर्याप्त जानकारी जो आप @@templates के हिस्सों का निर्माण कर सकते हैं जिन्हें आपको फ्लाई पर चाहिए।

+0

हम्म। मैं निश्चित रूप से आवेदन में किसी भी अतिरिक्त निर्भरता को अनिवार्य रूप से पेश नहीं करना चाहता हूं। मैं * ActiveRecord का उपयोग कर रहा था, लेकिन जब एप्लिकेशन शुरू होता है तो मुझे डेटाबेस को बदलने का विचार पसंद नहीं है; मुझे लगता है कि एक ही समय में दो डायनोस (मैं हेरोकू पर हूं) एक ही समय में आग लग सकती है। – coreyward

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