O único canal real desta aplicação não é personalizado

Prévia grátis 3 min de leitura

O app/channels/ não existe nesta aplicação. Não está vazio; o find app/channels não encontra nada. Mesmo assim a página do roadmap se atualiza ao vivo quando um admin reordena um curso, por um WebSocket, através de um canal do ActionCable. Esta aula trata do canal que faz isso, e a aplicação não o escreveu.

O turbo_stream_from, rastreado até uma classe

O app/views/catalog/courses/index.html.erb tem uma linha para isso: <%= turbo_stream_from "catalog_roadmap" %>. O helper gera uma tag de inscrição que aponta para o Turbo::StreamsChannel, uma classe que vem dentro da gem turbo-rails:

class Turbo::StreamsChannel < ActionCable::Channel::Base
  extend Turbo::Streams::Broadcasts, Turbo::Streams::StreamName
  include Turbo::Streams::StreamName::ClassMethods

  def subscribed
    if stream_name = verified_stream_name_from_params
      stream_from stream_name
    else
      reject
    end
  end
end

São quatro linhas de lógica, e cada uma é uma primitiva que este curso trata: subscribed (aula 5), verified_stream_name_from_params (aula 3), stream_from (aula 4) e reject (aula 5). A aplicação depende das quatro toda vez que essa página carrega, sem ter um canal próprio.

O comentário de documentação da gem é o programa deste curso

O comentário no topo do mesmo arquivo mostra como construir um canal próprio:

# class CustomChannel < ActionCable::Channel::Base
#   extend Turbo::Streams::Broadcasts, Turbo::Streams::StreamName
#   include Turbo::Streams::StreamName::ClassMethods
#
#   def subscribed
#     if (stream_name = verified_stream_name_from_params).present? &&
#         subscription_allowed?
#       stream_from stream_name
#     else
#       reject
#     end
#   end
#
#   def subscription_allowed?
#     # ...
#   end
# end

O ActionCable::Channel::Base é a classe pai de todo canal que roda nesta aplicação, o que hoje significa o da gem. Aprendê-lo é aprender aquilo de que o Turbo::StreamsChannel já depende, uma camada abaixo de onde o código da aplicação toca nele.

O que "sem app/channels" significa

O Rails não exige que uma aplicação defina canais. O servidor de cable é montado de qualquer jeito, e qualquer classe de canal que o Rails consiga carregar, venha de uma gem ou não, pode receber inscrições. Esta aplicação usa uma: o Turbo::StreamsChannel, carregado da turbo-rails quando uma inscrição o cita. Nada no config/cable.yml ou no config/routes.rb cita um canal. A ligação é: o helper gera uma tag, o JavaScript se inscreve, a classe do canal é resolvida pelo nome, e o subscribed roda. As próximas seis aulas percorrem esse caminho com canais que a aplicação ainda não tem, rodando cada passo em vez de confiar num tutorial.

Pontos-chave

  • O app/channels/ não existe nesta aplicação, então ela não tem canal próprio.
  • O único canal que a aplicação roda, o Turbo::StreamsChannel, vem na gem turbo-rails e herda de ActionCable::Channel::Base, a mesma classe base que um canal próprio usaria.
  • O subscribed de quatro linhas dele já usa as primitivas que este curso trata: verified_stream_name_from_params, stream_from e reject. O comentário da gem mostra a forma de canal próprio de que a aplicação não precisou.
  • Nada na configuração da aplicação cita um canal; um canal é resolvido pelo nome quando uma inscrição o pede, como qualquer outra classe Ruby.
Aula 1 de 7 · grátis

Continue com a aula 2

Conexões não têm identidade aqui

O que o identified_by faz e por que o identifiers vazio dá a toda conexão o mesmo identificador.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...