2011-11-24 18 views
26

के माध्यम से त्रुटि संदेश पास करना रीडायरेक्ट पर त्रुटि संदेशों को धक्का देने का सबसे अच्छा तरीका क्या है?फ्लैश

मैंने पहले कुछ दृष्टिकोणों का उपयोग किया है, लेकिन उनमें से दोनों को समस्या है।

(1) फ्लैश पर त्रुटि के साथ संपूर्ण वस्तु पासिंग और error_messages_for का उपयोग कर:

def destroy 
    if @item.destroy 
     flash[:error_item] = @item 
    end 
    redirect_to some_other_controller_path 
    end 

मैंने पाया कि इस विधि कुकी अतिप्रवाह कारण बनता है।

(2) एक भी त्रुटि संदेश पासिंग:

def destroy 
    if @item.destroy 
     flash[:error] = @item.full_messages[0] 
    end 
    redirect_to some_other_controller_path 
    end 

इस तरह से मैं केवल एक ही त्रुटि संदेश भेजने के लिए, वहाँ कई क्या कर रहे हैं? क्या कोई भी बेहतर तरीका जानता है?

उत्तर

61

सबसे पहले, आप एक वाक्य निर्धारित करके जो भी करने की कोशिश कर रहे हैं उसे प्राप्त कर सकते हैं।

flash[:error] = @item.errors.full_messages.to_sentence 

मुझे लगता है कि आप इसे कुकी को बहने के बिना सरणी के रूप में भी सेट कर सकते हैं।

flash[:error] = @item.errors.full_messages 

लेकिन जैसा कि अन्य लोग कहते हैं, फ्लैश आमतौर पर विशिष्ट संदेशों को वापस करने के लिए उपयोग किए जाने से बेहतर होता है।

उदाहरण के लिए।

flash[:error] = "We were unable to destroy the Item" 

एक आम पैटर्न इस प्रकार है।

def some_action 
    if @record.action 
    flash[:notice] = "Action performed successfully" 
    redirect_to @record  
    else 
    flash[:error] = "Action failed" 
    render :action => "some_action" 
    end 
end 

अर्थात्, हमारे पास दो पथ हैं।

  1. कार्य सफल हुआ। हम पुनर्निर्देशित करते हैं।
  2. कार्य विफल रहता है। हम एक पेज दिखाते हैं, एक त्रुटि फ्लैश करते हैं, और @record.errorserror_messages_for(@record) पर कॉल करने के लिए हाथ पर हैं यदि हम चाहें तो।
+0

निश्चित रूप से मदद करता है! धन्यवाद! – alexs333

+2

आपके उदाहरण के 'अन्य' अनुभाग के लिए आपको 'फ़्लैश.now [: त्रुटि] =" क्रिया विफल "' देखें: [the-flash] (http://guides.rubyonrails.org/action_controller_overview .html # फ्लैश) – Joris

0

के बाद से फ्लैश [: त्रुटि] एक हैश है, आपको त्रुटि संदेश यह करने के लिए एक "< <" ऑपरेटर

2

Flash साथ पारित कर सकते हैं रेल सत्र जो अनुरोधों के बीच मंजूरी दे दी है और रेल सत्र कार्यान्वित किया जाता है का एक हिस्सा है कुकीज़ का उपयोग करना (रेल-2 तक कम से कम)। Cookies आम तौर पर डेटा की बहुत कम मात्रा को स्टोर करने के लिए उपयोग किया जाता है क्योंकि डिफ़ॉल्ट कुकी स्टोर की अधिकतम राशि 4 केबीएस है जो मुझे लगता है। इसलिए पूरे मॉडल ऑब्जेक्ट्स को स्टोर करना बहुत अच्छा विकल्प नहीं हो सकता है। ऐसा करने के लिए आप एक अलग कुकी स्टोर का उपयोग कर सकते हैं जो आपको बड़ी मात्रा में डेटा स्टोर करने की अनुमति देगा।

दूसरी समस्या के लिए, आप फ़्लैश चर में कई त्रुटि संदेशों को स्टोर कर सकते हैं। जिस तरह से आपने flash[:error] किया था, आप वही कर सकते हैं और अन्य संदेशों को स्टोर करने के लिए अन्य संदेशों का उपयोग करके अन्य कुंजियों का उपयोग कर सकते हैं।

उम्मीद है कि इससे मदद मिलती है।

1

उत्तरों की Rails validation over redirect करने के लिए एक एक नया clone_with_errors का उपयोग कर पता चलता है मॉडल की वस्तु उदाहरण के एक उथले क्लोन करने के लिए।मुझे लगता है कि 4k सीमा से नीचे रहने में मदद कर सकता है; हालांकि मैं कल्पना कर सकता हूं कि जटिल मॉडल के लिए अभी भी समस्याएं हो सकती हैं, उदा। यह page written in 2007 which advocates against storing model object instances in the session देखें।

2

यह वही मेरे लिए काम किया है:

@item.errors.messages.map { |k,v| v }.join('<br>').html_safe 
+0

इसे मेरी राय में उत्तर के रूप में चिह्नित किया जाना चाहिए। –

+0

यहां 'html_safe' का उपयोग करके आपके त्रुटि संदेशों को उत्पन्न करने के तरीके के आधार पर असुरक्षित (XSS के लिए खुला) हो सकता है। अत्यधिक सावधानी के साथ प्रयोग करें ... – PinnyM

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