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!
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
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