2016-01-22 5 views
6

मैं सफलतापूर्वक एक्शनकेबल सेट करने, चैनलों को सुनने, अनुरोध प्रमाणित करने में सक्षम था। हालांकि, सृजन के बाद एक चैनल से कनेक्ट करने का प्रयास करते समय मैं अजीब बग में दौड़ रहा हूं (हार्ड व्याख्या करने के लिए, नीचे देखें)रेल 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% मौजूद है।

अगर मेरे पास दीवार पर पहले से ही कुछ पोस्ट हैं जो वे सफलतापूर्वक कनेक्ट करने में सक्षम हैं। केवल जब एक पोस्ट बनाया और प्रसारण किया जाता है हालांकि एक्शनकेबल यह डीबी में नहीं पाया जा सकता है। अगर मैं पृष्ठ को फिर से लोड करता हूं, तो वह पोस्ट जिसे हमने अभी बनाया है। सुनिश्चित नहीं है कि नई प्रसारण पोस्ट डीबी

+0

क्या आप वाकई 'पैरा [: id]' सेट हैं? कुंजी मौजूद है यह सुनिश्चित करने के लिए 'params.fetch (: id) 'का उपयोग करने का प्रयास करें। हो सकता है कि हैश में केवल स्ट्रिंग कुंजियां हों और प्रतीक न हों। – Oleander

+0

पैराम्स [: id] 100% मौजूद है – user3023421

+0

आपको क्लाइंट-साइड पर कौन सी आईडी मिल रही है? क्या आईडी को पृष्ठ से आईडी या डेटा विशेषता से पकड़ा जा रहा है? – cll

उत्तर

0

में क्यों नहीं मिल रही है क्या आपने अपने नियंत्रक में दोनों प्रसारण स्थापित किए हैं?

ActionCable.server.broadcast 'Post(:id:)', { :data: } 

नहीं तो आप से

"Wall(#{profile.id})" 

दोनों स्ट्रीम और डेटा प्राप्त करने के बाद तर्क जोड़ सकते हैं।

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