2011-08-11 15 views
8

एक रेल ऐप में मैंने पुश नोटिफिकेशन (चैट के लिए) के लिए फेय (रैक एडाप्टर) का उपयोग किया है।रेल के साथ रेल पब/सब

मैं फेय का उपयोग किसी अन्य उपयोग के मामले (अधिक पुश नोटिफिकेशन) के लिए करना चाहता हूं लेकिन मुझे इसे समझने की प्रतीत नहीं होती है।

मेरे ऐप में एक पृष्ठभूमि नौकरी से एक मॉडल बनाया जा सकता है, इसलिए जब मॉडल बनता है तो मैं अपने विचारों में से एक को रीफ्रेश करना चाहता हूं (इंडेक्स एक्शन कहें)।

तो जैसा:

एप्लिकेशन/मॉडल/post.rb

class Post 
    include Mongoid::Document 

    after_create :notify_subscribers 

    private 
    def notify_subscribers 
     Faye::Client.publish("/posts") 
    end 
end 

एप्लिकेशन/विचारों/पदों/index.html.erb

<%= subscribe_to(posts_url) do %> 
    uhh what do I do here? ajax call to refresh the whole page?? 
<% end %> 

तो से सूचना प्रकाशित कर रहा है एक after_create कॉलबैक और जब मुझे फेय सर्वर से एक संदेश मिलता है तो मैं "अपडेट" को लागू करने के बारे में कैसे जा सकता हूं? क्या मैं सर्वर से डेटा पुनः लोड करने के लिए बस एक AJAX कॉल करता हूं? ऐसा लगता है जैसे यह धीमा होगा।

इसके अलावा मैं मॉडल के लिए अद्यतन के लिए कुछ इसी तरह (जैसे कि एक उपयोगकर्ता कुछ टिप्पणियाँ जोड़ा या लेखक सामग्री बदल) उपयोग करती हैं इसलिए एक अच्छी योजना की तरह प्रतीत नहीं होता ... डीबी हर समय से हराने के लिए चाहते हैं

उत्तर

5

सबसे पहले, हाँ, after_create के साथ अधिसूचना प्रकाशित करना ठीक है। आपको अपने notify_subscribers विधि में क्या करना चाहिए, उस नए पोस्ट के बारे में सभी प्रासंगिक जानकारी प्रकाशित करना है जिसे आप क्लाइंट में उपयोग करना चाहते हैं ताकि आप को अधिसूचना प्राप्त होने पर एक और अनावश्यक AJAX अनुरोध करना पड़े।

तो, उदाहरण के लिए, title और पोस्ट के content प्रासंगिक उपयोगकर्ता तुरंत देखने के लिए के लिए के बाद यह बनाया जाता है, आप की तरह कुछ करना होगा रहे हैं: में

def notify_subscribers 
    client = Faye::Client.new('http://localhost:3000/faye') 
    client.publish("/posts/new", { 
    'title' => self.title, 
    'content' => self.content 
    }) 
end 

... और फिर, दृश्य, आप शायद सर्वर से प्राप्त नई पोस्ट के बारे में डेटा का उपयोग करने के लिए jQuery का उपयोग करेंगे। रेल कोड आपको यहां मदद नहीं करेगा। जैसे आप इस (यह मानते हुए आप jQuery का उपयोग कर रहे हैं और अपने शीर्षक में faye.js को शामिल किया है) करना होगा:

<script type="text/javascript"> 
$(function() { 
    var client = new Faye.Client('http://localhost:3000/faye'); 
    client.subscribe("/posts/new", function(data) { 
    /* do whatever you need with data */ 
    }); 
}); 
</script> 

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

+1

आप यह कैसे करते हैं मेरे फेय ने फॉर्म config.ru पर काम करने से इंकार कर दिया है और मुझे 'ऑर्डरमैचिन प्रारंभ नहीं हुआ है: eventmaachine प्रारंभ नहीं हुआ: evma_connect_to_server' हर बार जब मैं पोस्ट ऑब्जेक्ट बनाने की कोशिश करता हूं। क्या गलत है? – prikha

+0

@Prikha क्या आपने इसे हल करने में कामयाब रहे हैं? मुझे एक ही समस्या है। – Eduardo

+0

@Eduardo Yepp! जब आप उचित ढेर का उपयोग शुरू करते हैं तो सब कुछ जाता है। यूनिकॉर्न + पतला। और फेय लोड ईएम का उपयोग कर। – prikha