1

例如,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通过参数传递给的房间频道 ID,但还需要在执行操作中获取它以从相关房间频道广播。

谢谢!

4

1 回答 1

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

因为消息的所有属性都可用。

于 2016-04-24T01:15:15.833 回答