Откуда в ActionCable вызываются задания Rails и как передать параметры?

Например, где метод perform изначально вызывается в следующем задании:

вакансии/message_broadcast_job.rb

class MessageBroadcastJob < ApplicationJob
  queue_as :default

  def perform(message)
    ActionCable.server.broadcast "room_channel", message: render_message(message) #, roomId: roomId
  end

  private
    def render_message(message)
      ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
    end
end

В assets/javascripts/channels/room.coffee есть вызов метода:

  speak: (message, roomId) ->
    @perform 'speak', message: message, roomId: roomId

Но похоже, что это вызывает соответствующий метод в channels/room_channel.rb:

def speak(data)
     Message.create! text: data['message'], user_id: 1, room_id: data['roomId']
  end

Итак, откуда вызывается задание и как я могу передать ему параметры? (В частности, у меня есть идентификатор канала комнаты, который я уже передал в room_channel.rb через параметры, но мне также нужно получить его в действии выполнения для трансляции с соответствующего канала комнаты.

Спасибо!


person Laser    schedule 24.04.2016    source источник


Ответы (1)


В модели models/message.rb

after_create_commit { MessageBroadcastJob.perform_later self }

Помещает задание в очередь после создания сообщения. Таким образом, в файле задания вы можете получить доступ к параметрам через сам объект, в данном случае через сообщение.

В частности, в этом случае это будет:

 def perform(message)
    ActionCable.server.broadcast "room_channel_#{message.room_id}", message: render_message(message) #, roomId: roomId
  end

Поскольку все атрибуты сообщения доступны.

person Laser    schedule 24.04.2016