https://github.com/rails/actioncable-examplesからアクションケーブルの例を試しました。ActiveRecordでうまくいきました。RethinkDBで NoBrainer を使用すると、 ActiveJob::SerializationError (Unsupported argument type: Comment)が発生します。そのため、以下のように、self の代わりに id を activejob に渡しました。しかし、アクション ケーブル サーバーはどのチャネルもリッスンできず、CommentsChannel メソッドは呼び出されません。
コメント.rb
after_save { CommentRelayJob.perform_later(self.id) }
*****comment_relay_job.rb*****
def perform(comment_id)
comment = Comment.find(comment_id)
ActionCable.server.broadcast "messages:#{comment.message_id}:comments",
comment: CommentsController.render(partial: 'comments/comment', locals: { comment: comment }
end
コメントチャンネル.rb
module ApplicationCable
class Channel < ActionCable::Channel::Base; end
end
class CommentsChannel < ApplicationCable::Channel
def follow(data)
stop_all_streams
stream_from "messages:#{data['message_id'].to_i}:comments"
end
def unfollow
stop_all_streams
end
end
コメント.コーヒー
App.comments = App.cable.subscriptions.create "CommentsChannel", collection: -> $("[data-channel='comments']")
connected: ->
setTimeout =>
@followCurrentMessage()
@installPageChangeCallback()
, 1000
received: (data) ->
@collection().append(data.comment) unless @userIsCurrentUser(data.comment)
userIsCurrentUser: (comment) ->
$(comment).attr('data-user-id') is $('meta[name=current-user]').attr('id')
followCurrentMessage: ->
if messageId = @collection().data('message-id')
@perform 'follow', message_id: messageId
else
@perform 'unfollow'
installPageChangeCallback: ->
unless @installedPageChangeCallback
@installedPageChangeCallback = true
$(document).on 'page:change', -> App.comments.followCurrentMessage()