2008-09-24 14 views
6

रेल v2.1 का उपयोग करके, मान लें कि आपके पास एक नियंत्रक के लिए एक क्रिया है जो एक से अधिक स्थानों से सुलभ है। उदाहरण के लिए, रेल ऐप के भीतर, आपके पास दो अलग-अलग विचारों से उपयोगकर्ता को संपादित करने का एक लिंक है, एक उपयोगकर्ता इंडेक्स व्यू पर, और दूसरा एक अन्य दृश्य से (प्रत्येक पृष्ठ पर एनएवी बार से कहें)।सशर्त रीडायरेक्ट के लिए सबसे अच्छा तरीका?

मुझे आश्चर्य है कि उपयोगकर्ता को उस लिंक के आधार पर सही स्थान पर रीडायरेक्ट करने का सबसे अच्छा तरीका क्या है।

उदाहरण 1: उदाहरण के लिए:

  1. सूची सभी उपयोगकर्ताओं की सूची
  2. उपयोगकर्ता क्लिक करता है फार्म पर "सहेजें" में एक उपयोगकर्ता पर
  3. क्लिक करें "संपादित करें", नियंत्रक वापस 1 पर रीडायरेक्ट ।

उदाहरण 2:

  1. उपयोगकर्ता cou एलडी आवेदन के भीतर किसी भी पेज पर हो, एनएवी बार वर्तमान उपयोगकर्ता को संपादित करने के लिए एक लिंक दिखाता है
  2. उपयोगकर्ता
  3. संपादित करने के लिए लिंक पर क्लिक करता है उपयोगकर्ता उपयोगकर्ता पर "सेव" पर क्लिक करता है, नियंत्रक जो भी पेज पर रीडायरेक्ट करता है वे तब थे जब उपयोगकर्ता ने नेविगेशन बार में "संपादन" लिंक पर क्लिक किया था।

मैं इसे द्वारा पूर्व में की गई देखा है:

  1. मूल नियंत्रक/कार्रवाई, जिसमें लिंक दिखाई देता है के साथ मूल संपादित करें लिंक पर एक पैरामीटर लगाकर। इसे और अधिक DRY बनाने के लिए, आप एक सहायक में @ controller.controller_name और @ controller.action_name का उपयोग कर सकते हैं।
  2. नियंत्रक पैरामीटर को सत्र चर में सहेजता है।
  3. एक बार नियंत्रक ने रिकॉर्ड सहेजा है, यह सत्र चर पर रीडायरेक्ट करता है।

जो मुझे विशेष रूप से इस समाधान के बारे में पसंद नहीं है, वह विचारों में प्रत्येक लागू लिंक पर पैरामीटर जोड़ने की आवश्यकता है। मैं सोच रहा हूं कि यह सब नियंत्रक में बनाने का कोई तरीका है या नहीं।

एक बेहतर तरीका है मैं सोच रहा था था:

  1. प्लेस रेफरर को बचाने के लिए "संपादित करें" कार्रवाई पर एक before_filter सत्र में (? पर्याप्त इस विश्वसनीय है)।
  2. जब "अपडेट" मारा जाता है, तो नियंत्रक सत्र चर पर रीडायरेक्ट करेगा और फिर सत्र चर को हटा देगा।

ऐसा करने के सर्वोत्तम तरीके पर कोई विचार?

उत्तर

1

मुझे लगता है कि संपादन कार्रवाई पर पहले_फिल्टर का उपयोग कम से कम घुसपैठ कर रहा है।

रेफरर पर्याप्त विश्वसनीय होना चाहिए ... कोई रेफरर उपलब्ध होने के मामले में बस एक डिफ़ॉल्ट है (कहें: किसी ने संपादन पृष्ठ को बुकमार्क किया है) और आपको ठीक होना चाहिए।

2

फ़्लैश: डेटा जो आप केवल अगले अनुरोध के लिए उपयोग करेंगे फ्लैश में संग्रहीत किया जा सकता है। तो आपको इसे स्वचालित रूप से साफ़ करने के बारे में नहीं जाना है। यह एप्लिकेशन संदर्भ के सीमित बिट्स के लिए अच्छी तरह से काम करता है, जो आपको केवल एक बार आवश्यकता है - केवल त्रुटि संदेशों के लिए नहीं!

मुझे पता है कि आपने पिछली HTTP पहुंच क्या किया है: यदि आपको लोगों को अंतिम URL पर रीडायरेक्ट करने की आवश्यकता है, तो बस ऐसा करें। request.referer, अधिकांश ब्रोवरों के लिए जो जानकारी को अवरुद्ध नहीं करते हैं, आपको वह अंतिम यूआरएल देता है जिस पर व्यक्ति था।

#in edit controller 
... 
flash[:page_to_redirect_to] = request.referer || "/my/default/path" 
... 

#in save controller 
redirect_to flash[:page_to_redirect_to] || "/my/default/path" 

मैं आकस्मिक रूप से उनको हार्डकोडिंग का सुझाव नहीं दूंगा।

पहले_फिल्टर: मैं रेलवे डेवलपर्स को अपने पसंदीदा हथौड़ा के रूप में उपयोग करके और बाकी सब कुछ नाखूनों में बदल रहा हूं। जब आप नियंत्रक में सभी या पर्याप्त रूप से सभी विधियों के लिए कार्यक्षमता का खुलासा करना चाहते हैं तो फ़िल्टर उपयोगी होते हैं। मुझे नहीं पता कि यह जरूरी मामला है, लेकिन आपका लाभ भिन्न हो सकता है। यदि आप जरूरी हैं तो आप उपरोक्त दो चालों के साथ फ़िल्टर को जोड़ सकते हैं।

+0

अच्छे विचार, आपने मुझे एक अलग समस्या के बारे में सोचने में मदद की जो मैं देख रहा था। धन्यवाद! –

+0

मुझे मिल गया है, लेकिन सत्र चर आवश्यक हो सकता है क्योंकि इसे फॉर्म सत्यापन त्रुटियों में लगातार जारी रखने की आवश्यकता है। आपका उत्तर इस के लिए कैसे पूरा करता है? पहले_फिल्टर बेहतर DRY-ness देता है क्योंकि इस व्यवहार को नियंत्रक में कई कार्रवाइयों में होना आवश्यक है। –

+0

यदि आपको किसी अन्य अनुरोध के लिए फ़्लैश में सहेजी गई कुछ चीज़ों को जारी रखने की आवश्यकता है (उदाहरण के लिए, इसे एक त्रुटि सुधार चरण से पहले प्राप्त करने के लिए) तो आप या तो स्पष्ट रूप से इसे जारी रखना चुन सकते हैं ('फ़्लैश [: foo] = फ़्लैश [: foo]') या, यदि यह आपको समग्र रूप से कम दर्द का कारण बनता है, तो सत्र का उपयोग करें और इसे पूरा होने पर स्पष्ट रूप से साफ़ करें। –

0

एक और तरीका ओवरले में फॉर्म को लोड करना है, जैसे http://flowplayer.org/tools/overlay/index.html, और फिर AJAX सबमिट पर आप ओवरले बंद कर सकते हैं। मैं इसे "नया जोड़ें" विकल्प प्रदान करने के लिए एक स्वतः पूर्ण के साथ संयोजन में करता हूं। एक बार ओवरले फॉर्म जमा हो जाने पर, मैं जेसन में कुछ डेटा वापस कर देता हूं, जिसे स्वतः पूर्ण करने के लिए किया जाता है। (मैंने अपने सभी plugin को सभी के साथ मदद करने के लिए बनाया है)

यह थोड़ा और काम लेता है, लेकिन यह वास्तव में अंतिम उपयोगकर्ता के लिए अच्छा काम करता है।

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