मैं एक रेल 2.3.1 वेबसाइट विकसित कर रहा हूं। पूरे वेब साइट पर, मुझे विभिन्न पृष्ठों पर पोस्ट बनाने के लिए एक फॉर्म होना चाहिए (होम पेज, पोस्ट पेज बनाएं, पोस्ट लिस्टिंग पेज, टिप्पणी सूची पृष्ठ इत्यादि - यह कहने के लिए पर्याप्त है कि इस फॉर्म को कई पेजों पर परोसा जाना चाहिए विभिन्न नियंत्रकों)। इनमें से प्रत्येक पृष्ठ विभिन्न प्रकार की अन्य जानकारी प्रदर्शित करता है जो संबंधित नियंत्रक/क्रिया में पुनर्प्राप्त होते हैं। पूर्व, होम पेज में नवीनतम 10 पोस्ट सूचीबद्ध हैं, डीबी से खींची गई सामग्री, आदिकई पृष्ठों पर एक ही फॉर्म रखने के लिए रेल का सर्वोत्तम अभ्यास
इसलिए, मैंने पोस्ट निर्माण फ़ॉर्म को अपने आंशिक रूप में स्थानांतरित कर दिया है, और यह सभी आवश्यक पृष्ठों पर आंशिक शामिल है। ध्यान दें कि आंशिक पोस्ट में प्रश्न/प्रश्न (जो पोस्ट नियंत्रक :: मार्गों के लिए मार्ग बनाता है - यह डिफ़ॉल्ट रेल व्यवहार है)।
जिस समस्या में मैं चल रहा हूं वह है जब पोस्ट फॉर्म सही ढंग से पूरा नहीं होता है, डिफ़ॉल्ट रूप से पोस्टकंट्रोलर :: विधि प्रस्तुत करने के प्रश्न/new.html.erb बनाएं, भले ही फ़ॉर्म होम पेज से सबमिट किया गया हो (/ घर/index.html.erb)।
मैंने "submitting_controller" और "submitting_action" सबमिट करने के लिए आंशिक रूप में फ़ॉर्म को बदलने का प्रयास किया, और पोस्टकंट्रोलर :: बनाएं, जब @ post.save? == झूठी, मैं कार्रवाई => "../submitting_controller/submitting_action" प्रस्तुत करता हूं (जो थोड़ा हैकी है, लेकिन आपको गैर-पोस्ट नियंत्रक से क्रियाएं प्रस्तुत करने देता है)।
यह सतह पर ठीक काम करने लग रहा था। अपूर्ण रूप को उस दृश्य में प्रस्तुत किया गया था जो इसे सभी सही @ post.errors संदेश आदि के साथ प्रस्तुत किया गया था। समस्या यह थी कि पृष्ठों पर मौजूद अन्य सभी डेटा दिखाई नहीं दे रहे थे, क्योंकि वास्तविक सबमिटिंग_कंट्रोलर/सबमिट करने की विधि को नहीं बुलाया गया था, बस संबंधित दृश्य (Remeber, मैंने एक रेंडर किया है जो एक रीडायरेक्ट_to की बजाय इंस्टेंस ऑब्जेक्ट्स को संरक्षित करता है जो @post इंस्टेंस ऑब्जेक्ट को सुरक्षित नहीं करता है जिसमें सभी त्रुटि संदेश और सबमिट किए गए मान हैं।)
जहां तक मैं देख सकता हूं कि मेरे पास दो विकल्प हैं :
1) मैं @ post.save पर सत्र में @ पोस्ट ऑब्जेक्ट स्टोर कर सकता हूं? PostController में विफल रहता है :: सबमिट करें, redirect_torollitting/submitting_action को रीडायरेक्ट करें, जिस बिंदु पर मैं सत्र के बाहर @ पोस्ट ऑब्जेक्ट खींचता हूं और फॉर्म/त्रुटि संदेशों को फिर से पॉप्युलेट करने के लिए इसका उपयोग करता हूं। (जहां तक मैं समझता हूं, सत्र में वस्तुओं को संग्रहित करना रेल में बीएडी अभ्यास है)
2) मैं विभिन्न सबमिटिंग_कॉलर/सबमिटिंग_एक्शन से गैर-पोस्ट निर्माण फ़ॉर्म डेटा खींचने के लिए उपयोग किए गए सभी तर्कों को स्थानांतरित कर सकता हूं, इसे ApplicationController, PostController :: में एक विशाल स्विच कथन बनाएं सबमिट करने के लिए सबमिट करें/कंट्रोलिंग/सबमिट करने के लिए बनाएं और प्रत्येक सबमिट करने वाले पृष्ठ के प्रस्तुत करने के लिए आवश्यक सभी अतिरिक्त डेटा को पकड़ने के लिए एप्लिकेशन नियंत्रक में विधियों को कॉल करें।
विचार रेल के भीतर ऐसा करने का सबसे अच्छा तरीका है?
एम्फी, नेस्टेड विशेषताओं के बारे में अच्छी बात। वह मेरे लिए नहीं हुआ था। इसके अलावा जो भी आप गैर-जेएस को डिफॉल्ट करने के बारे में सोचते हैं, वह महत्वपूर्ण है। हालांकि मुझे यह महसूस हो रहा है कि प्रश्नकर्ता (बेहतर संभाल की कमी के लिए :) डीबी कार्रवाई की मात्रा के माध्यम से आवेदन प्रदर्शन को नुकसान पहुंचाएगा, उसे सभी वस्तुओं को पुनर्निर्माण करने की आवश्यकता होगी। – robertpostill
इस पर हम सहमत हैं। हालांकि, गैर-जावास्क्रिप्ट और AJAX के बीच का अंतर आमतौर पर एक link_to_remote कॉल होता है, एक आरजेएस जो एक टेम्पलेट प्रस्तुत करता है, और संभावित रूप से डेटाबेस कॉल से बचने के लिए थोड़ा नियंत्रक तर्क जो आप सामान्य रूप से अन्यथा करते हैं। – EmFi
एएमएफआई, दुर्भाग्य से पोस्ट मॉडल और मॉडल जो नियंत्रक हैं, आप फॉर्म को प्रस्तुत करने के लिए उपयोग करेंगे, संबंधित नहीं हो सकते हैं। (होमकंट्रोलर के पास बैकिंग मॉडल भी नहीं है)। मैं PostController :: निर्माण में कैप्चा तंत्र पर कुछ जांच करता हूं (कैप्चा फ़ील्ड पोस्ट मॉडल का हिस्सा नहीं है, बल्कि इसके स्वयं के मॉड्यूल)। मुझे लगता है कि आप और रॉबर्टपोस्टिल दोनों सही हैं AJAX में इस समस्या से निपटने का तरीका है।मुझे बस यह समझना होगा कि jQuery के साथ इसे कैसे करना है (मैंने प्रोटोटाइप, व्यक्तिगत प्रीफ़ का उपयोग करने का विकल्प चुना है) और रेल में कुछ भी नहीं मिला है। – empire29