2016-04-28 77 views
3

我已經建立了一個簡單的與Rails 5和ActionCable聊天,我有一個簡單的「聊天」頻道。ActionCable:如何使用動態頻道

我怎樣才能使頻道訂閱和消息廣播動態,所以我可以創建聊天頻道,並有消息去正確的渠道?

我找不到一個不幸的代碼示例。

更新

下面的答案是正確的。我還發現它現在在導軌指南中提到。不要認爲這是有前http://edgeguides.rubyonrails.org/action_cable_overview.html#client-server-interactions-subscriptions

回答

9

您的訂閱創建傳遞一個roomId在javascripts/channels/room.js

MakeMessageChannel = function(roomId) { 
    // Create the new room channel subscription 
    App.room = App.cable.subscriptions.create({ 
    channel: "RoomChannel", 
    roomId: roomId 
    }, { 
    connected: function() {}, 
    disconnected: function() {}, 
    received: function(data) { 
     return $('#messages').append(data['message']); 
    }, 
    speak: function(message, roomId) { 
     return this.perform('speak', { 
     message: message, 
     roomId: roomId 
     }); 
    } 
    }); 

    $(document).on('keypress', '[data-behavior~=room_speaker]', function(event) { 
    if (event.keyCode === 13) { 
     App.room.speak(event.target.value, roomId); 
     event.target.value = ""; 
     event.preventDefault(); 
    } 
    return $('#messages').animate({ 
     scrollTop: $('#messages')[0].scrollHeight 
    }, 100); 
    }); 
}; 

channels/room_channel.rb變得可作爲訂購創建一個參數,而說話的動作也只是所謂正確的數據:

def subscribed 
    stream_from "room_channel_#{params[:roomId]}" 
    end 

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

然後,如果你從工作中廣播

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

真棒謝謝你今晚試試吧 –

+1

當你有多個聊天室時,這是如何工作的?如何使用您的示例訂閱roomA和roomB並根據用戶是否擁有訪問權限在服務器上對其進行授權? –

+0

然後如何將@ room.id從控制器傳遞到room.js? – icemelt

相關問題