5

मेरे पास मेरे ऐप/संपत्ति/जावास्क्रिप्ट/चैनल फ़ोल्डर में एक संदेश.js.erb फ़ाइल है जो प्रत्येक चैट रूम को डेटाबेस से लेने और उस चैट रूम के लिए चैनल सदस्यता बनाने के लिए कोड उत्पन्न करना चाहिए।मैं अपने ऐप में .js.erb फ़ाइल को precompile/कैश नहीं करने के लिए रेल कैसे कहूं?

यहाँ मेरी messages.js.erb फ़ाइल

//**app/assets/javascripts/channels/messages.js.erb** 

$(document).on('turbolinks:load', function() { 
    submitNewMessage(); 
}); 

<% Chatroom.all.each do |chatroom| %> 
    App['room' + <%=chatroom.id%>] = App.cable.subscriptions.create({channel: 'MessagesChannel', room: <%=chatroom.id%>}, { 
    received: function(data) { 
    $("[data-chatroom='" + this.chatroomId + "']").removeClass('hidden'); 
    return $("[data-chatroom='" + this.chatroomId + "']").append(data.message); 
    }, 

    setChatroomId: function(chatroomId) { 
    this.chatroomId = chatroomId; 
    } 
}); 

<% end %> 

function submitNewMessage(){ 
    //console.log(uid); 
    $('textarea#message_content').keydown(function(event) { 
    if (event.keyCode === 13) { 
     var msg = event.target.value; 
     var chatroomId = $("[data-chatroom]").data().chatroom; 
     var uid = $('#uid').val(); 
     //console.log(uid); 
     App['room' + chatroomId].setChatroomId(chatroomId); 
     App['room' + chatroomId].send({message: msg, chatroom_id: chatroomId, user_id: uid}); 
     $('[data-textarea="message"]').val(" "); 
     return false; 
    } 
    }); 
} 

अधिमानतः, इस फ़ाइल को हर बार एक नई चैटरूम बनाई गई है फिर से लोड करना चाहिए है, लेकिन रेल पहले के बाद (precompiling?) कैश कर रहा है फ़ाइल (asset?) प्रत्येक अनुरोध पर लोड और सेवा।

तो, समस्या यह है कि: हर बार जब कोई नया चैटरूम बनाया जाता है, तो अगर मैं इसे स्ट्रीम करना चाहता हूं (यानी, उस चैट रूम के प्रत्येक प्रतिभागी को तुरंत स्ट्रीम करने के लिए संदेश पोस्ट करने में सक्षम हो), मुझे फ़ाइल को बदलने की ज़रूरत है मैन्युअल रूप से (व्हाइटस्पेस जोड़कर, या कंसोल में टिप्पणियां जोड़ने या लॉगिंग करके, something) और इसे सहेजते हैं ताकि रेल सोचते हैं कि फ़ाइल बदल गई है और इसे फिर से लोड किया गया है, जिससे सभी Chatroom एस पर फिर से चल रहा है जिसमें नव निर्मित चैट रूम भी शामिल है।

अन्यथा, जब मैं एक chatroom कि अभी तक स्ट्रीमिंग नहीं है (क्योंकि कैश्ड संस्करण यह नहीं देख सकते हैं) मैं एक

Uncaught TypeError: Cannot read property 'setChatroomId' of undefined at HTMLTextAreaElement. (messages.self-cbf13df66ead12b7956faa24e880ce07c0289634216a096fafd4ac1c6d262f43.js?body=1:436) at HTMLTextAreaElement.dispatch (jquery-1.11.3.min.self-ad66c584c2469d2bb527ba7aef5893549f1554ccc8ab3ccb43bd09ce8c3bf7a1.js?body=1:5) at HTMLTextAreaElement.r.handle (jquery-1.11.3.min.self-ad66c584c2469d2bb527ba7aef5893549f1554ccc8ab3ccb43bd09ce8c3bf7a1.js?body=1:5)

अपने ब्राउज़र कंसोल में

मिल (में संदेश पर (हिट दर्ज करें) पोस्ट डेवलपर उपकरण)। त्रुटि का स्रोत है:

यहाँ उत्पन्न messages.js कोड (दोहराने लाइनों संक्षिप्तता के लिए छंटनी की)

$(document).on('turbolinks:load', function() { 
     submitNewMessage(); 
    }); 



    App['room' + 1] = App.cable.subscriptions.create({channel: 'MessagesChannel', room: 1}, { 
    received: function(data) { 
    $("[data-chatroom='" + this.chatroomId + "']").removeClass('hidden'); 
    return $("[data-chatroom='" + this.chatroomId + "']").append(data.message); 
    }, 

    setChatroomId: function(chatroomId) { 
    this.chatroomId = chatroomId; 
    } 
}); 
    . 
    . 
    . 
    . 
    . 
    . 
    . 
    App['room' + 37] = App.cable.subscriptions.create({channel: 'MessagesChannel', room: 37}, { 
    received: function(data) { 
    $("[data-chatroom='" + this.chatroomId + "']").removeClass('hidden'); 
    return $("[data-chatroom='" + this.chatroomId + "']").append(data.message); 
    }, 

    setChatroomId: function(chatroomId) { 
    this.chatroomId = chatroomId; 
    } 
}); 


function submitNewMessage(){ 
    //console.log(uid); 
    $('textarea#message_content').keydown(function(event) { 
    if (event.keyCode === 13) { 
     var msg = event.target.value; 
     var chatroomId = $("[data-chatroom]").data().chatroom; 
     var uid = $('#uid').val(); 
     App['room' + chatroomId].setChatroomId(chatroomId); // <-- line 436 
     App['room' + chatroomId].send({message: msg, chatroom_id: chatroomId, user_id: uid}); 
     $('[data-textarea="message"]').val(" "); 
     return false; 
    } 
    }); 
} 

मैं समझता हूँ कि इस त्रुटि स्पष्ट है है, App['room' + 38] के बाद से परिभाषित नहीं किया गया है फिर भी आईडी 38 के साथ नए चैट रूम के लिए जिसमें हम संदेश पोस्ट करने की कोशिश कर रहे हैं (यहां, आईडी के साथ सभी चैट रूम> 37)

लेकिन मैं रेल को कैसे समझूं कि इस फ़ाइल को हर बार एक नया चैट रूम फिर से लोड करने की आवश्यकता है बनाया गया है। यदि हर बार नहीं, तो हर अनुरोध पर? असल में, रेल को बताएं कि इसे प्रीकंपाइल/कैश न करें ताकि मैं चलने पर चैट रूम और स्ट्रीम बना सकूं?

उत्तर

1

फ़ाइल को lib/assets या vendor/assets निर्देशिका पर ले जाएं।

doc से:

...assets under lib/assets or vendor/assets are available for inclusion via the application manifests but no longer part of the precompile array.

सुनिश्चित करें कि यह आपके application.js में सूचीबद्ध नहीं है और तुम जाना अच्छा होना चाहिए।

+0

यदि मैं फ़ाइल को lib/assets या विक्रेता/संपत्ति में ले जाता हूं, तो रेल इसे बिल्कुल लोड नहीं करते हैं। सभी चैट रूम – Rahul

+0

स्ट्रीमिंग बंद कर देते हैं यह [प्रश्न] [https://stackoverflow.com/questions/24168916/confusion-about-the-vendor-folder) उत्तर कहता है कि मुझे स्पष्ट रूप से lib (या विक्रेता) संपत्तियों में फ़ाइल की आवश्यकता है अगर मैं रेल को लोड करना चाहता हूं। मैंने ऐसा किया, लेकिन फिर मैं एक ही समस्या में फिर से चला गया – Rahul

+1

@ राहुल हम्म ... जैसा कि मैं इसे समझता हूं, स्पॉकेट तीन स्थानों से संपत्ति लोड करेगा: ऐप/assests, lib/संपत्ति और विक्रेता/संपत्ति आवश्यकतानुसार। Precompiling केवल ऐप/संपत्ति के लिए रेल के रूप में होता है> 3.2.6। जब मैं दिन में बाद में समय लेता हूं और आशा करता हूं कि एक कामकाजी डेमो स्थापित करे तो मैं इसे और कुछ और देखूंगा। मैंने जो दस्तावेज़ उद्धृत किया है वह निश्चित रूप से इस व्याख्या का समर्थन करता है। – MarsAtomic

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