从ActionCable中调用Rails作业的位置以及如何传递参数?

时间:2016-04-24 00:38:01

标签: ruby-on-rails websocket jobs ruby-on-rails-5 actioncable

例如,在以下作业中最初调用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

那么调用作业的位置,以及如何将参数传递给它? (具体来说,我有一个房间频道ID,我已经通过参数传递给room_channel.rb,但也需要在执行动作中通过相关的房间频道进行广播。

谢谢!

1 个答案:

答案 0 :(得分: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

由于消息的所有属性都可用。