2016-01-22 3 views
6

Мне удалось успешно настроить 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

+0

Вы уверены, что 'params [: id]' установлен? Попробуйте использовать 'params.fetch (: id)', чтобы гарантировать, что ключ существует. Возможно, хэш содержит только строковые ключи, а не символы. – Oleander

+0

params [: id] 100% существует – user3023421

+0

Где вы получаете идентификатор, который передается на стороне клиента? Является ли идентификатор захватываемым из идентификатора или атрибута данных со страницы? – cll

ответ

0

Вы настроили обе трансляции в своем контроллере?

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

В противном случае вы можете передавать как с

"Wall(#{profile.id})" 

и добавить логику после получения данных.

Смежные вопросы