मेरे पास मेरे ऐप/संपत्ति/जावास्क्रिप्ट/चैनल फ़ोल्डर में एक संदेश.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)
लेकिन मैं रेल को कैसे समझूं कि इस फ़ाइल को हर बार एक नया चैट रूम फिर से लोड करने की आवश्यकता है बनाया गया है। यदि हर बार नहीं, तो हर अनुरोध पर? असल में, रेल को बताएं कि इसे प्रीकंपाइल/कैश न करें ताकि मैं चलने पर चैट रूम और स्ट्रीम बना सकूं?
यदि मैं फ़ाइल को lib/assets या विक्रेता/संपत्ति में ले जाता हूं, तो रेल इसे बिल्कुल लोड नहीं करते हैं। सभी चैट रूम – Rahul
स्ट्रीमिंग बंद कर देते हैं यह [प्रश्न] [https://stackoverflow.com/questions/24168916/confusion-about-the-vendor-folder) उत्तर कहता है कि मुझे स्पष्ट रूप से lib (या विक्रेता) संपत्तियों में फ़ाइल की आवश्यकता है अगर मैं रेल को लोड करना चाहता हूं। मैंने ऐसा किया, लेकिन फिर मैं एक ही समस्या में फिर से चला गया – Rahul
@ राहुल हम्म ... जैसा कि मैं इसे समझता हूं, स्पॉकेट तीन स्थानों से संपत्ति लोड करेगा: ऐप/assests, lib/संपत्ति और विक्रेता/संपत्ति आवश्यकतानुसार। Precompiling केवल ऐप/संपत्ति के लिए रेल के रूप में होता है> 3.2.6। जब मैं दिन में बाद में समय लेता हूं और आशा करता हूं कि एक कामकाजी डेमो स्थापित करे तो मैं इसे और कुछ और देखूंगा। मैंने जो दस्तावेज़ उद्धृत किया है वह निश्चित रूप से इस व्याख्या का समर्थन करता है। – MarsAtomic