2010-04-23 23 views
12

मैं मॉडल पर्यवेक्षक में फ़्लैश [नोटिस] फ्लैश करने के लिए एक संदेश असाइन करने का प्रयास कर रहा हूं।रेल मॉडल तक पहुंच [: नोटिस] मॉडल में

यह सवाल पहले से ही कहा गया है: Ruby on Rails: Observers and flash[:notice] messages?

हालांकि, मैं निम्न त्रुटि संदेश जब मैं अपने मॉडल में यह तक पहुँचने का प्रयास मिलती है:

class ModelObserver < ActiveRecord::Observer 
    observe A, B, C 

    def after_save(model) 
    puts "Model saved" 
    flash[:notice] = "Model saved" 
    end 
end
:

undefined local variable or method `flash' for #<ModelObserver:0x2c1742c>

यहाँ मेरी कोड है

मुझे पता है कि विधि को बुलाया जा रहा है क्योंकि "मॉडल सहेजा गया" टर्मिनल पर मुद्रित है।

क्या पर्यवेक्षक के अंदर फ्लैश का उपयोग करना संभव है, और यदि हां, तो कैसे?

+1

तकनीकी तौर पर मान्य समाधान है कि MVC टूट जाता है: http://stackoverflow.com/questions/393395/how-to-call-expire-fragment-from-rails-observer-model/608700#608700 – titaniumdecoy

उत्तर

11

मुझे जेनेरिक "@model सफलतापूर्वक अपडेट किया गया" ओवरराइड करने के लिए मॉडल में flash[:notice] सेट करने की आवश्यकता है।

यह मैं

  1. संबंधित मॉडल जब जरूरत flash_notice
  2. तब मैं संबंधित मॉडल में आभासी विशेषता निर्धारित बुलाया में एक आभासी विशेषता बनाया
  3. एक after_filter प्रयुक्त जब इस आभासी विशेषता थी क्या किया डिफ़ॉल्ट फ्लैश

पर आप ओवरराइड करने के लिए खाली नहीं हैं आप मेरे नियंत्रक और मॉडल को देख सकते हैं कि मैंने इसे कैसे पूरा किया:

class Reservation < ActiveRecord::Base 

    belongs_to :retailer 
    belongs_to :sharedorder 
    accepts_nested_attributes_for :sharedorder 
    accepts_nested_attributes_for :retailer 

    attr_accessor :validation_code, :flash_notice 

    validate :first_reservation, :if => :new_record_and_unvalidated 

    def new_record_and_unvalidated 
    if !self.new_record? && !self.retailer.validated? 
     true 
    else 
     false 
    end 
    end 

    def first_reservation 
    if self.validation_code != "test" || self.validation_code.blank? 
     errors.add_to_base("Validation code was incorrect") 
    else 
     self.retailer.update_attribute(:validated, true) 
     self.flash_notice = "Your validation as successful and you will not need to do that again" 
    end 
    end 
end 

class ReservationsController < ApplicationController 

    before_filter :authenticate_retailer! 
    after_filter :flash_notice, :except => :index 

    def flash_notice 
    if [email protected]_notice.blank? 
     flash[:notice] = @reservation.flash_notice 
    end 
    end 
end 
+0

क्या आप '' '' '' '' '' '' '' '' '' '' '' _ '' _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – Besi

17

नहीं, आप इसे नियंत्रक में सेट करते हैं जहां बचत हो रही है। flashActionController::Base पर परिभाषित एक विधि है।

+6

रयान की सही यद्यपि । आपको नियंत्रक में फ्लैश सेट करना चाहिए ... यह दृश्य प्रस्तुति परत का एक फ़ंक्शन है। उपरोक्त "उत्तर" यह काम करने के लिए बहुत खतरनाक भारी उठाने वाला है। –

+0

जैसा कि मैंने अपनी पोस्ट में कहा था, मेरे आवेदन में नियंत्रक अव्यवहारिक (यदि यह भी संभव है) में फ्लैश सेट करना। जब भी मॉडल अपडेट होता है तो मुझे फ़्लैश में एक संदेश जोड़ने की आवश्यकता होती है; मुझे ऐसा करने की एक और विधि से अनजान है - कम से कम दीवार पर स्पेगेटी कोड की प्लेट फेंकने के बिना। – titaniumdecoy

+0

मैंने आज भी संक्षेप में कुश्ती की, लेकिन अपनी खुद की दुविधा हल करने के बाद मैंने देखा कि आपने मेरे ऊपर टिप्पणी में अपने प्रश्न का उत्तर दिया है। "मॉडल को अद्यतन होने पर मुझे फ्लैश में एक संदेश जोड़ने की ज़रूरत है।" मुझे पता है कि आपने कहा है कि यह अव्यवहारिक है लेकिन मैंने अपने फ्लैश को मेरे नियंत्रक की अद्यतन विधि के अंदर रखा है। (एक अपवाद पकड़ रहा था और फिर एक त्रुटि चमक रहा था।) – Tass

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