O único canal real desta aplicação não é personalizado
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 gemturbo-railse herda deActionCable::Channel::Base, a mesma classe base que um canal próprio usaria. - O
subscribedde quatro linhas dele já usa as primitivas que este curso trata:verified_stream_name_from_params,stream_fromereject. 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.
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.