2016-08-26 7 views
9

Przeszukałem internet daleko i szeroko (w tym czytając wiele przykładów kodu dla ActionCable), co wydaje się być odpowiedzią na bardzo podstawowe pytanie . Niestety, nie rozwiązałem mojego problemu.Ruby on Rails 5 Action Cable: strumień dla bieżącej instancji modelu (subskrypcje oparte na adresie URL)

Załóżmy, że mam model Search i nawigowałem pod adresem URL /searches/1.

Chciałbym również mieć plik search.coffee pod javascripts/channels/ który rozpoczyna się z:

App.instance = App.cable.subscriptions.create 'SearchChannel' 

i SearchChannel klasy, która wygląda tak:

class SearchChannel < ApplicationCable::Channel 
    def subscribed 
    search = Search.find(params[:id]) 
    stream_for search 
    end 

    def unsubscribed 
    end 
end 

Oczywiście, powyższy kod generuje błąd, ponieważ params[id] to nil.

Oto moje pytania:

  • Jak mogę zapisać się do prawidłowego Search przykład na podstawie adresu URL?
  • Jak uniknąć subskrypcji na SearchChannel, jeśli jestem na innym adresie URL, który nie wymaga subskrypcji, np. /searches/1/results?

Dziękujemy za pomoc!

Odpowiedz

1

Jeśli spojrzysz na implementację ActionCable.Subscriptions#create, można ją wywołać na dwa sposoby.

Opcja 1 (z NAZWAKANAŁU)

App.cable.subscriptions.create 'SearchChannel' 

Opcja 2 (z kanałem Przedmiot)

App.cable.subscriptions.create channel: 'SearchChannel', id: 'Best Room' 

Jeśli się z wariantem 1, wewnętrznie, to jest przekształcany kanał Object.

Tak więc, jeśli chcesz uchwycić id po stronie serwera, trzeba użyć 2nd opcji i przekazać id z search, to powinieneś być w stanie uchwycić go po stronie serwera, jak opisano:

class SearchChannel < ApplicationCable::Channel 
    def subscribed 
    search = Search.find(params[:id]) 
    stream_for search 
    end 

    def unsubscribed 
    end 
end 

Aby uzyskać więcej informacji, patrz Client-Server Interactions and Subsciptions.

+1

Dziękuję za odpowiedź, ale to mi nie pomoże. Czytałem już o tej opcji w dokumentacji, ale to, o czym się mylę, to w szczególności sposób wysłania tego "id" do "SearchChannel". Railsy umieszczają 'search.coffee' pod' javascripts/channels/', co oznacza, że ​​muszę przekazać ten" identyfikator "skądś do tego pliku. Na tym polega moja trudność. – Vadim

+2

Nie jestem do końca pewien, co próbujesz osiągnąć dzięki subskrypcji "SearchChannel". Ale jeśli chcesz przechwycić '@ search.id' po stronie ruby ​​po stronie javascript, masz wiele opcji. Opcja 1: Gdy jesteś w adresie URL '/ searches/1', możesz sparsować adres URL w javascript i przekazać" id "z adresu URL do' App.cable.subscriptions.create'. Opcja 2: W nagłówku szablonu 'show' zapisz' id' w javascript, na przykład: <% = javascript_tag "var search_id = # {params [: id]}"%> i przekaż, że 'search_id' to' App.cable.subscriptions.create'. Nadzieja, która pomaga. – Dharam