2016-01-22 29 views
6

Sono riuscito a impostare con successo ActionCable, ascoltare i canali, autenticare richieste, ecc. Tuttavia, mi trovo in un bizzarro errore quando provo a connettermi a un canale subito dopo la creazione (difficile per spiegare, vedi sotto)Rails 5: ActionCable e db non sincronizzati

Ho un setup, un profilo ha un muro e il muro contiene molti post. Ogni post ha il proprio canale e il muro stesso ha il proprio canale. Quando un post è creato su una parete, viene aggiornato tramite 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 
    } 
}); 

ho semplificato, ma questo funziona come previsto. Quando vengono creati nuovi post, il canale Wall viene attivato, il client riceve il post e tutto va bene.

Il problema è la connessione dei nuovi post trasmessi. Quando vado ad ascoltare il nuovo post non riesce a prendere il posto dal db:

# 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 
    } 
}); 

In particolare il sottoscritto PostsChannel viene chiamato con il corretto id, ma quando si va a prendere il posto:

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 

restituisce sempre nulla indipendentemente da ciò che accade. In altre parole, non è in grado di recuperare il post dal DB anche se esiste al 100%.

Se ho già alcuni post su un muro, sono in grado di connettersi correttamente. SOLO quando un post viene creato e trasmesso tramite ActionCable, non è possibile trovarlo nel DB. Se ricarico la pagina, il post che abbiamo appena creato funziona. Non sei sicuro del motivo per cui il post appena trasmesso non viene trovato nel db

+0

Sei sicuro che 'params [: id]' è impostato? Prova a usare 'params.fetch (: id)' per assicurarti che la chiave esista. Potrebbe essere che l'hash sia composto solo da chiavi stringa e non da simboli. – Oleander

+0

parametri [: id] 100% esiste – user3023421

+0

Dove stai ottenendo l'ID che viene passato sul lato client? L'ID viene afferrato da un ID o da un attributo di dati dalla pagina? – cll

risposta

0

Hai impostato entrambe le trasmissioni nel controller?

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

In caso contrario è possibile lo streaming sia da

"Wall(#{profile.id})" 

e aggiungere la logica dopo la ricezione dei dati.

Problemi correlati