2009-11-08 12 views
12

तो मेरे पास add_equip नामक आरक्षण मॉडल में एक विधि है। यह विधि यह सुनिश्चित करने के लिए कुछ जांच करती है कि उपकरण का जोड़ा टुकड़ा मान्य है (दूसरे आरक्षण के साथ विवाद नहीं)।रेल - मॉडल से एक त्रुटि संदेश प्राप्त करना जो सत्यापन त्रुटि नहीं है

चेक काम करते हैं। यदि उपकरणों का एक जोड़ा टुकड़ा जोड़ा नहीं जाना चाहिए, तो यह नहीं है, और यदि यह होना चाहिए।

समस्या मैं समझ नहीं कैसे संदेश वापस नियंत्रक करने के लिए भेजने के लिए फ़्लैश संदेश में रखा जा रहा है? मुझे पता है कि मुझे यहां कुछ याद आना चाहिए, लेकिन मैंने कुछ घंटों के लिए गुगल किया है और वास्तव में कोई स्पष्ट स्पष्टीकरण नहीं मिल सकता है कि नियंत्रक को त्रुटियों को कैसे पास किया जाए, जब तक कि वे सत्यापन त्रुटियां न हों। आरक्षण मॉडल

def add_equip equip 
    if self.reserved.find_by_equip_id(equip.id) 
    self.errors.add_to_base("Equipment Already Added") 
    return false 
    elsif !equip.is_available?(self.start, self.end) 
    self.errors.add_to_base("Equipment Already Reserved") 
    return false 
    else 
    r = Reserved.new 
    r.reservation = self 
    r.equip = equip 
    r.save 
    end 
    end 

किसी भी मदद में reservations_controller

def add_equip 
    @reservation = Reservation.find(params[:id]) 
    @addedEquip = Equip.find(params[:equip_id]) 

    respond_to do |format| 
    if @reservation.add_equip(@addedEquip) 
     flash[:notice] = "Equipment was added" 
     format.html { redirect_to(edit_reservation_path(@reservation)) } 
    else 
     flash[:notice] = @reservation.errors 
     format.html { redirect_to(edit_reservation_path(@reservation)) } 
    end 
    end 
    end 

add_equip में

add_equip बहुत सराहना की जाएगी। मुझे पता है कि मैं यहाँ कुछ बुनियादी याद कर रहा हूँ।

उत्तर

21

त्रुटि संदेश को संग्रहीत करने के लिए add_to_base का उपयोग करना मुझे ठीक लगता है, आपको बस यह देखने की आवश्यकता है कि इसे कैसे देखें।

कैसे के बारे में:

flash[:notice] = @reservation.errors.full_messages.to_sentence 

मान लें कि आप एक विधि को पुनः प्रदर्शित करने के लिए जा रहे हैं, आप भी शायद इस्तेमाल कर सकते हैं:

<%= f.error_messages %> 

या संभवतः:

<%= error_messages_for :reservation %> 

इसके अलावा , हो सकता है कि आप फ्लैश [: त्रुटि] का उपयोग करना चाहें, फिर आप अपने दृश्य में एक सीएसएस वर्ग के साथ इसे अलग-अलग रंग सकते हैं।

+0

धन्यवाद ".full_messages।to_sentance "चाल चल रही थी। मुझे पता था कि मुझे कुछ मूर्खतापूर्ण याद आना चाहिए। – raytiley

+0

फ्लैश संदेश में model.errors.full_messages का उपयोग करना आईएमएचओ इसे हल करने का एक खराब तरीका है। 'error_messages_for: model' त्रुटि संदेशों को प्रदर्शित करने का पारंपरिक तरीका है, आपने संकेत दिया। समस्या को हल करने का सही तरीका बेस पर बजाय equip_id पर त्रुटि डालना होगा और फिर केवल संपादन फ़ॉर्म क्रिया प्रस्तुत करना होगा। कोई रीडायरेक्ट आवश्यक नहीं है। –

+0

यह एक अच्छा बिंदु है, फिर से प्रस्तुत करना बेहतर होगा पेज। –

1

मुझे लगता है कि मैं देख सकता हूं कि उपयोगकर्ता को त्रुटियों को वापस क्यों नहीं भेजा जा रहा है।

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

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

def add_equip 
    @reservation = Reservation.find(params[:id]) 
    @addedEquip = Equip.find(params[:equip_id]) 

    respond_to do |format| 
    if @reservation.add_equip(@addedEquip) 
     flash[:notice] = "Equipment was added" 
     format.html { redirect_to(edit_reservation_path(@reservation)) } 
    else 
     flash[:error] = 'Error adding equipment' 
     format.html { render :action => :edit } 
    end 
    end 
end 

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

इसके अलावा, मॉडल कोड के लिए बस थोड़ी सुझाव है, जब संभव हो (सहित नियंत्रक फ्लैश संदेशों के लिए) i18n उपयोग करने के लिए प्रयास करें। हालांकि यह ज्यादातर एक निजी पसंद है, यह आपके सभी संदेशों और विशिष्ट पाठ करने के लिए एक तार्किक घर देता है, और alos आप सामान्य या डिफ़ॉल्ट संदेशों जो कई मॉडल और नियंत्रकों में परिवर्तन डुप्लिकेट करने के बजाय एक ही स्थान पर बदला जा सकता है बनाने के लिए अनुमति देता है।

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

def add_equip equip 
    if self.reserved.find_by_equip_id(equip.id) 
    self.errors.add_to_base(:already_added) 
    return false 
    elsif !equip.is_available?(self.start, self.end) 
    self.errors.add_to_base(:already_reserved) 
    return false 
    else 
    r = Reserved.new 
    r.reservation = self 
    r.equip = equip 
    r.save 
    end 
end 
+0

उत्तर के लिए धन्यवाद। पहली पोस्ट ने रीडायरेक्ट कोड को बदले बिना इस मुद्दे को हल किया। I18n सुझाव हालांकि एक अच्छा विचार है। धन्यवाद। – raytiley

+0

मैं दृढ़ता से अनुशंसा करता हूं कि आप मेरे उदाहरण का पालन करने के लिए अपना कोड बदल दें। पहला उदाहरण त्रुटियों को प्रदर्शित करने के लिए मानक सम्मेलन का पालन नहीं कर रहा है, और हालांकि यह स्वयं में एक बुरी चीज नहीं है, आपकी समस्या नई नहीं है और इस वर्कफ़्लो को सौदा करने का एक मानक तरीका पहले से स्थापित है। सम्मेलन के बाद अन्य डेवलपर कस्टम वर्कफ़्लो या त्रुटि संदेशों को प्रदर्शित करने के तरीके के बिना आपके कोड को तेज़ी से समझ पाएंगे। –

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