2016-04-24 12 views
1

Zum Beispiel, in dem die die perform Methode ursprünglich in diesem folgenden Job immer genannt:Woher werden Rails Jobs in ActionCable aufgerufen und wie können Sie Parameter übergeben?

Jobs/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 

In assets/Javascripts/channels/room.coffee gibt es einen Methodenaufruf :

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

Aber das scheint in Kanälen/room_channel.rb die entsprechende Methode aufzurufen:

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

Wo wird der Job aufgerufen und wie kann ich Parameter übergeben? (Genauer gesagt habe ich ein Zimmer Kanal-ID ich bereits room_channel.rb über Parameter übergeben habe, aber auch diese erhalten müssen in der Aktion durchführen aus dem jeweiligen Raumkanal auszustrahlen.

Dank!

Antwort

1

Im Modell models/message.rb

after_create_commit { MessageBroadcastJob.perform_later self } 

Versetzt den Job in die Warteschlange nach der Erstellung der Nachricht. Deshalb wird in der Job-Datei selbst Sie Parameter über das Objekt zugreifen können, um die Nachricht in diesem Fall.

Technische Da In diesem Fall wäre es:

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

Da alle Attribute für die Nachricht verfügbar sind.