Мне удалось успешно настроить ActionCable, прослушивать каналы, аутентифицировать запросы и т. Д. Однако я пытаюсь подключиться к каналу сразу после создания (сложно чтобы объяснить, см. ниже)Rails 5: ActionCable и db не синхронизированы
У меня есть настройка, профиль имеет стену, а стена содержит много сообщений. Каждый столбик имеет свой собственный канал, а сама стена имеет свой собственный канал. Когда сообщение создается на стене, она обновляется через 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
он всегда возвращает null независимо от того, что происходит. Другими словами, он не получает сообщение из БД, хотя он существует на 100%.
ЕСЛИ У меня есть несколько сообщений уже на стене, которые они могут успешно подключить. ТОЛЬКО, когда сообщение создается и транслируется через ActionCable, оно не может быть найдено в БД. Если я перезагружу страницу, сообщение, которое мы только что создали, работает. Не знаете, почему новосерийный пост не найден в db
Вы уверены, что 'params [: id]' установлен? Попробуйте использовать 'params.fetch (: id)', чтобы гарантировать, что ключ существует. Возможно, хэш содержит только строковые ключи, а не символы. – Oleander
params [: id] 100% существует – user3023421
Где вы получаете идентификатор, который передается на стороне клиента? Является ли идентификатор захватываемым из идентификатора или атрибута данных со страницы? – cll