मैं सफलतापूर्वक एक्शनकेबल सेट करने, चैनलों को सुनने, अनुरोध प्रमाणित करने में सक्षम था। हालांकि, सृजन के बाद एक चैनल से कनेक्ट करने का प्रयास करते समय मैं अजीब बग में दौड़ रहा हूं (हार्ड व्याख्या करने के लिए, नीचे देखें)रेल 5: एक्शनकेबल और डीबी सिंक्रनाइज़ नहीं किया जा रहा है
मेरे पास एक सेटअप है, प्रोफ़ाइल में एक दीवार है और दीवार में कई पोस्ट हैं। प्रत्येक पोस्ट का अपना चैनल होता है, और दीवार के पास स्वयं का चैनल होता है। जब एक पोस्ट एक दीवार पर बनाई गई है, यह ActionCable के माध्यम से अद्यतन किया जाता है:
# Wall's Cable Channel
class WallsChannel < ApplicationCable::Channel
def subscribed
profile = Profile.find_by_id params[:id]
if ability.can? :subscribe, profile
stream_from "Wall(#{profile.id})"
else
reject
end
end
end
# Broadcasting to the wall
ActionCable.server.broadcast 'Wall(:id:)', { :data: }
# Client Side
GlobalCable.cable.subscriptions.create({channel: 'WallsChannel', id :id: }, {
received: function(data) {
// do stuff with a new post on a wall
}
});
मैं इसे सरल बनाया है, लेकिन के रूप में इरादा इस काम करता है। जब नई पोस्ट बनाई जाती हैं तो दीवार चैनल ट्रिगर हो जाता है, क्लाइंट पोस्ट और सब अच्छा प्राप्त करता है।
समस्या प्रसारित की गई नई पोस्ट को जोड़ रही है। यह डाटाबेस से पोस्ट लाने में विफल रहता है जब मैं नई पोस्ट को सुनने के लिए जाना:
# Posts Cable Channel
class PostsChannel < ApplicationCable::Channel
def subscribed
post = Post.find_by_id params[:id]
if ability.can? :subscribe, post
stream_from "Post({#{post.id}})"
else
reject
end
end
end
# Client side
GlobalCable.cable.subscriptions.create({ channel: 'PostsChannel', id: id }, {
received: function(data) {
// do stuff
}
});
विशेष रूप PostsChannel सब्सक्राइब्ड उचित आईडी के साथ कहा जाता हो जाता है, लेकिन जब यह पद हड़पने के लिए चला जाता है:
post = Post.find_by_id params[:id]
# SQL that is generated
# SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = :id: LIMIT 1
#^Always returns null even though we just created the post
यह हमेशा होता है कि यह क्या होता है इसके बावजूद यह शून्य हो जाता है। दूसरे शब्दों में यह डीबी से पोस्ट लाने में असफल रहा है, भले ही यह 100% मौजूद है।
अगर मेरे पास दीवार पर पहले से ही कुछ पोस्ट हैं जो वे सफलतापूर्वक कनेक्ट करने में सक्षम हैं। केवल जब एक पोस्ट बनाया और प्रसारण किया जाता है हालांकि एक्शनकेबल यह डीबी में नहीं पाया जा सकता है। अगर मैं पृष्ठ को फिर से लोड करता हूं, तो वह पोस्ट जिसे हमने अभी बनाया है। सुनिश्चित नहीं है कि नई प्रसारण पोस्ट डीबी
क्या आप वाकई 'पैरा [: id]' सेट हैं? कुंजी मौजूद है यह सुनिश्चित करने के लिए 'params.fetch (: id) 'का उपयोग करने का प्रयास करें। हो सकता है कि हैश में केवल स्ट्रिंग कुंजियां हों और प्रतीक न हों। – Oleander
पैराम्स [: id] 100% मौजूद है – user3023421
आपको क्लाइंट-साइड पर कौन सी आईडी मिल रही है? क्या आईडी को पृष्ठ से आईडी या डेटा विशेषता से पकड़ा जा रहा है? – cll