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
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
parametri [: id] 100% esiste – user3023421
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