2016-11-22 1 views
3

Ich habe ActionCable für ein paar Tage angeschaut und es fällt mir schwer zu verstehen, wie man es benutzt. Nachdem ich verschiedene Beispiele angeschaut, YouTube Videos angesehen und einige der Ruby Edge Guides gelesen habe, bin ich mir immer noch nicht sicher, wie ich es in mein Projekt implementieren soll.Fehler beim Verständnis ActionCable

Was ich versuche die Top-20-Ergebnisse aus meiner Broadcast-Tabelle und legen Sie sie in die ‚Futtermittel‘ div vom application.html.erb hier zu tun ist, erhalten, ist der Code für das div:

<div class="content"> 
    <div id="feed"> 
    <h1>TEST</h1> 
    </div> 
    <%= yield %> 
</div> 

ich habe dies eingeschlossen in meinem 'routes.rb':

mount ActionCable.server => '/cable' 

Dies ist 'feeds.coffee':

App.feeds = App.cable.subscriptions.create "FeedsChannel", 
    connected: -> 
    # Called when the subscription is ready for use on the server 

    disconnected: -> 
    # Called when the subscription has been terminated by the server 

    received: (data) -> 
    $(".content #feed").append(data); 
    # Called when there's incoming data on the websocket for this channel 

Und hier ist 'feeds_channel.rb':

# Be sure to restart your server when you modify this file. Action Cable runs in a loop that does not support auto reloading. 
class FeedsChannel < ApplicationCable::Channel 
    def subscribed 
     messages = Broadcast.all 
     stream_for messages 
     ActionCable.server.broadcast("FeedsChannel", messages.last(20)) 
    end 

    def unsubscribed 
    # Any cleanup needed when channel is unsubscribed 
    end 
end 

ich natürlich etwas zu tun, bin hier dumm und kann, wo nicht funktioniert. Hier ist ein Ausdruck aus dem Konsolausgabe

=> Booting Puma 
=> Rails 5.0.0.1 application starting in development on http://0.0.0.0:8080 
=> Run `rails server -h` for more startup options 
Puma starting in single mode... 
* Version 3.6.2 (ruby 2.3.0-p0), codename: Sleepy Sunday Serenity 
* Min threads: 5, max threads: 5 
* Environment: development 
* Listening on tcp://0.0.0.0:8080 
Use Ctrl-C to stop 
Started GET "/" for 144.124.4.228 at 2016-11-24 12:13:51 +0000 
Cannot render console from 144.124.4.228! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 
    ActiveRecord::SchemaMigration Load (1.8ms) SELECT "schema_migrations".* FROM "schema_migrations" 
Processing by HomeController#index as HTML 
    Rendering home/index.html.erb within layouts/application 
    Rendered home/index.html.erb within layouts/application (2.2ms) 
    Rendered sessions/_login.html.erb (1.8ms) 
Completed 200 OK in 709ms (Views: 692.0ms | ActiveRecord: 0.0ms) 


Started GET "/cable" for 144.124.4.228 at 2016-11-24 12:13:54 +0000 
Cannot render console from 144.124.4.228! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 
Started GET "/cable/" [WebSocket] for 144.124.4.228 at 2016-11-24 12:13:54 +0000 
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket) 
    User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 41], ["LIMIT", 1]] 
Registered connection (Z2lkOi8vY3NhL1VzZXIvNDE) 
    Broadcast Load (2.0ms) SELECT "broadcasts".* FROM "broadcasts" ORDER BY "broadcasts"."id" DESC LIMIT ? [["LIMIT", 20]] 
[ActionCable] Broadcasting to FeedsChannel: [#<Broadcast id: 38, content: "Hello From APP!!!\n", user_id: 41, created_at: "2016-11-18 16:24:38", updated_at: "2016-11-18 16:24:38">, #<Broadcast id: 39, content: "Hello from MrPaul's App\n", user_id: 41, created_at: "2016-11-18 18:07:41", updated_at: "2016-11-18 18:07:41">, #<Broadcast id: 40, content: "New app test 2", user_id: 41, created_at: "2016-11-18 18:09:13", updated_at: "2016-11-18 18:09:13">, #<Broadcast id: 41, content: "ALALLALALALALA", user_id: 41, created_at: "2016-11-18 19:13:40", updated_at: "2016-11-18 19:13:40">, #<Broadcast id: 42, content: "LALALA TETS", user_id: 41, created_at: "2016-11-18 19:19:09", updated_at: "2016-11-18 19:19:09">, #<Broadcast id: 43, content: "Tets from app fro feeds", user_id: 41, created_at: "2016-11-18 19:37:38", updated_at: "2016-11-18 19:37:38">, #<Broadcast id: 44, content: "fsfsdf", user_id: 41, created_at: "2016-11-18 19:38:14", updated_at: "2016-11-18 19:38:14">, #<Broadcast id: 45, content: "Test from app tesrers", user_id: 41, created_at: "2016-11-18 19:38:48", updated_at: "2016-11-18 19:38:48">, #<Broadcast id: 46, content: "lalalalal", user_id: 41, created_at: "2016-11-21 17:26:55", updated_at: "2016-11-21 17:26:55">, #<Broadcast id: 47, content: "cdsc", user_id: 41, created_at: "2016-11-21 17:51:25", updated_at: "2016-11-21 17:51:25">, #<Broadcast id: 48, content: "nohonnl", user_id: 41, created_at: "2016-11-21 18:12:22", updated_at: "2016-11-21 18:12:22">, #<Broadcast id: 49, content: "rewrewwrwr", user_id: 41, created_at: "2016-11-22 12:45:16", updated_at: "2016-11-22 12:45:16">, #<Broadcast id: 50, content: "sefewr", user_id: 41, created_at: "2016-11-22 14:45:19", updated_at: "2016-11-22 14:45:19">, #<Broadcast id: 51, content: "fdsfdsfsd", user_id: 41, created_at: "2016-11-22 16:41:04", updated_at: "2016-11-22 16:41:04">, #<Broadcast id: 52, content: "trrretretr", user_id: 41, created_at: "2016-11-22 17:40:20", updated_at: "2016-11-22 17:40:20">, #<Broadcast id: 53, content: "fdsfsdfsd", user_id: 41, created_at: "2016-11-22 17:47:05", updated_at: "2016-11-22 17:47:05">, #<Broadcast id: 54, content: "fdsds", user_id: 41, created_at: "2016-11-22 18:05:17", updated_at: "2016-11-22 18:05:17">, #<Broadcast id: 55, content: "fdsfs", user_id: 41, created_at: "2016-11-22 18:23:44", updated_at: "2016-11-22 18:23:44">, #<Broadcast id: 56, content: "iyuirriry", user_id: 41, created_at: "2016-11-22 18:32:00", updated_at: "2016-11-22 18:32:00">, #<Broadcast id: 57, content: "fdsfsfs", user_id: 41, created_at: "2016-11-23 15:23:08", updated_at: "2016-11-23 15:23:08">] 
FeedsChannel is transmitting the subscription confirmation 

ich in der Konsole ausgesehen haben und ein bisschen graben Client-Seite durchgeführt und finden, wenn ich schreibe ‚App.feeds.received.data‘ it kommt zurück als 'undefined' welche Teile fehlen mir, um das funktioniert zu bekommen? Danke.

+0

Folgen Sie [diesem Blog] (https://blog.heroku.com/real_time_rails_implementing_websockets_in_rails_5_with_action_cable), da dies deutlich erklärt, wie Sie mit ActionCable beginnen. – sahil

Antwort

1

Ich glaube nicht, dass Sie von der abonnierten Methode übertragen sollten. Alles, was Sie es brauchen sollte, ist:

def subscribed 
    stream_from "feed" 
end 

Auf Seite zu laden, sollten Sie nur alle Broadcast-Nachrichten machen Sie innerhalb des Feeds div möchten, wenn die Seite zunächst wiedergegeben wird, und dann übertragen Sie alle Clients, wenn etwas ist zum Feed hinzugefügt. Wenn alle Clients abonniert sind und von "Feeds" streamen, sollte sie in jedem Client-Browser aktualisiert werden.

Auf der Serverseite, wo Sie ein neues Broadcast-Objekt (wahrscheinlich innerhalb des Modells oder Controller) erstellt haben, fügen Sie einfach:

ActionCable.server.broadcast "feed", messages: new_broadcast_object 

Aktion Kabel JSON senden, so dass Sie nicht gerade nach oben schicken Ruby Objekte durch den Web-Socket und hängen Sie die Daten in Client-Seite Javascript. Stellen Sie sicher, dass Ihre Nachricht eine HTML-Zeichenfolge ist, oder konvertieren Sie Ihr new_broadcast_object-Objekt in JSON, wenn Sie es clientseitig manipulieren müssen.

Verwandte Themen