2017-04-22 189 views
0

我是ActionCable和套接字的新手,嘗試實現一些實時功能。Rails 5 ActionCable設置和工作流程

我成功地在我的應用程序中實現了實時通知功能(基本功能),但是有一些事情我花了一些時間來理解。

我的實時通知代碼:

的認證過程:

# Connection.rb (using Devise) 
module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :current_user 

    def connect 
     self.current_user = env['warden'].user 
     reject_unauthorized_connection unless self.current_user 

     logger.add_tags 'ActionCable', current_user.email 
    end 

    end 
end 

通知信道:

class NotificationsChannel < ApplicationCable::Channel 
    def subscribed 
    stream_from "notification_channel_#{current_user.id}" 
    end 

    def unsubscribed 
    end 
end 

Notifications.coffee

App.notifications = App.cable.subscriptions.create "NotificationsChannel", 
    connected: -> 

    disconnected: -> 

    received: (data) -> 
    this.update_counter(data.counter) 

    # if use_sound is "true" play a mp3 sound 
    # use_sound is sent ("true" or "false") because when a notification is destroyed we don't want to use sound only update counter 

    if data.use_sound == "true" 
     $("#sound-play").get(0).play() 

    # Update Notifications Counter and change color 

    update_counter: (counter) -> 
    $("#notifications-counter").html("#{counter}") 

    if counter > 0 
     $("#notifications-counter").css('color','#FFA5A5') 
    else 
     $("#notifications-counter").css('color','white') 

而re是通過通知計數器向頻道廣播的作業文件

注意:我只發送通知計數,因爲在用戶單擊(例如, 2通知) - 按鈕,通過AJax呼叫切換下拉列表並填充。

我的問題是:

  1. 是正常的,有所有的時間「GET /電纜」與「未經授權的連接嘗試被拒絕」當未登錄用戶的響應(我的理解請求Connect.rb文件中的current_user是從cookie設置的,但是當用戶位於ex主頁,登錄頁面等時,基本上沒有進行身份驗證。

    在服務器日誌中,我可以看到每個1 ,2秒GET /電纜 enter image description here

    這是正常的嗎?我在想,如果用戶註銷或者其他什麼,我不得不停止這種操作。

  2. 當我啓動服務器時,在服務器啓動瀏覽器控制檯時,出現類似於10秒的錯誤。既然通知有效,我不知道這是不是一個問題,但它是一個錯誤。

    WebSocket連接到 'WS://本地主機:3000 /電纜' 失敗:錯誤的連接建立:網:: ERR_CONNECTION_REFUSED

    我甚至嘗試設置config.action_cable.mount_path = 「/電纜」 或「WS :// localhost:3000/cable「,並沒有解決它。

  3. 接下來,我想實現一個聊天,其中2個用戶可以有私人對話,是Connection.rb'secure'中定義的「current_user」,我如何將授權添加到ActionCable或類似的東西。在我的應用程序的其餘部分中,我使用CanCan Gem並且完美地工作。

非常感謝您花時間閱讀這個問題。如果你有我的問題的答案,我會非常感激他們。如果你有一些指導或建議與ActionCable進行復雜而安全的聊天,我很樂意聽到他們。謝謝!

回答

1

我想你想看的是cable.js文件,其中createConsumer函數被調用。

創建消費者是訂閱用戶到頻道的內容。我認爲你需要關注何時調用這段代碼。

您正在使用用戶身份驗證來拒絕未經授權的使用。

這非常好,但是當爲任何訪客創建JS消費者時(即將cable.js加載到application.js中的所有頁面),這並不是那麼好。

你可以做的是使用content_for成一個單獨的佈局驗證的用戶調用cable.js創造一個消費者,並確保cable.js不會被納入到未經授權的網頁。

+0

這是一個好主意!我的應用程序有多個佈局,我們知道用戶在哪個佈局中記錄它。在閱讀您的答案之前,我想到了以下解決方案,注意我並不真正知道它的解決方案。如果我們設置了一個timeOut並且調用在js的某處執行'unfollow',如果例如$('notification-counter-id')不存在,並且在取消關注方法服務器端,我們執行stop_all_streams。我不確定如果我們拒絕current_user,因爲他沒有通過驗證,我們可以調用執行'unfollow'。而不是確定何時調用「取消關注」或何時在代碼中執行stop_all_streams。 –

+0

做一個取消追蹤的方法就像做黑名單。每個人都選擇加入,然後在整個過程中選擇退出。我認爲另一種方法不那麼複雜和強大,因爲只有登錄用戶才能獲得消費者,如果手動完成,仍然會拒絕他們。如果您要使用unfollow方法,那麼拒絕的一部分將變爲廣播unfollow,爲消費者創建渠道操作和代碼。 – fbelanger

+0

你絕對是對的。還有一件事,所以我可以更好地理解ActionCable。當用戶未登錄時,我的應用場景是:用戶位於本地主機,因爲我們在application.rb中包含了電纜,他嘗試通過createCustomer進行訂閱,這裏是我不明白的地方,createCustomer調用'follow'函數在NotificationsChannel中訂閱它吧?我檢查了DHH ActionCable示例,並在每個「聊天室」中調用@performe,這是邏輯,因爲如果我們更改房間然後流到新房間,我們想停止所有流。對不起,如果我表達自己很差。 :) –