Roda é uma estrutura da web em Ruby criada para trazer o melhor de Sinatra e Cuba para o desenvolvimento da web em Ruby. Roda foi projetada em torno do conceito de “árvore de roteamento”.
No desenvolvimento da web, o roteamento é o processo de receber uma solicitação e, em seguida, encontrar o código que trataria dessa solicitação. Considere um caminho de solicitação HTTP como o mostrado abaixo.
GET users/1/invoices
Ao decidir como lidar com uma rota, um framework da web típico (por exemplo, Ruby on Rails ou Sinatra) analisa o caminho completo da solicitação, iterando uma série de rotas possíveis para corresponder à solicitação.
Por outro lado, uma estrutura de árvore de roteamento como o Roda verifica cada segmento do caminho da solicitação antes de continuar.
Ao lidar com a solicitação acima, Roda olha para o primeiro segmento, /users
. Se este segmento não corresponder à solicitação, ele ignorará todo o ramal /users
para que as outras rotas em /users
não sejam consideradas. Se /users
corresponder, ele irá procurar na ramificação /users
/1
. Ele continua dessa maneira até que a rota seja encontrada ou, caso contrário, retorna um status 404
(não encontrado) se a rota não puder ser correspondida.
Por que Roda?
Desempenho
Como o tratamento de rotas não envolve a iteração por meio de uma matriz de rotas, a sobrecarga por solicitação é significativamente menor quando comparada a outros frameworks Ruby.

Usabilidade
O que torna uma árvore de roteamento interessante não é apenas o desempenho, mas o fato de que, a qualquer momento durante o roteamento, você pode operar na solicitação atual.
Simplicidade
O Roda foi concebido para ser simples, tanto interna como externamente. Ele usa uma árvore de roteamento para permitir que você escreva um código mais simples e mais DRY.
Confiabilidade
Roda tem muito pouca poluição de namespace global. Todas as variáveis de instância usadas internamente na árvore de roteamento são prefixadas com um sublinhado ( @_variable
), para que não entrem em conflito com as variáveis de instância que o usuário deseja usar. Além disso, Roda prefixa constantes com Roda::
( Roda:: constant
) para evitar conflito com as constantes que você usa em sua aplicação.
Extensibilidade
Roda é extensível através de amplo suporte a plugins. Você pode substituir qualquer parte do Roda e chamar super
para obter o comportamento padrão.
Uma árvore de roteamento simples
Vamos começar criando um pequeno aplicativo da web para entender como é trabalhar com o Roda. Roda é mais uma biblioteca Ruby do que um framework, e não possui comandos utilitários CLI para realizar tarefas regulares. Portanto, ao contrário de Rails e outros frameworks, ele não tem comandos para criar um novo projeto, gerar modelos, controladores e outras tarefas repetitivas de comando.
Vamos criar um diretório para armazenar nossos arquivos de projeto.
mkdir my_roda_app
Em seguida, adicionamos um Gemfile
para gerenciar as gemas que usaremos. Adicione a gema roda
ao arquivo e, em seguida, puma
, que será nosso servidor de aplicação web. Nosso Gemfile
será semelhante a este.
fonte"https://rubygems.org" joia"roda"
gema"puma"
Agora executamos bundle install
para instalar as joias que adicionamos.
pacote de instalação
A maioria das estruturas da web Ruby foram construídas em cima do Rack, que, de acordo com a documentação do Rack, é uma interface de servidor web Ruby modular.
Rack fornece uma interface mínima, modular e adaptável para o desenvolvimento de aplicações web em Ruby. Ao agrupar solicitações e respostas HTTP da maneira mais simples possível, ele unifica e destila a API para servidores da web, estruturas da web e software intermediário (o chamado middleware) em uma única chamada de método.
Documentação do rack
Roda é compatível com Rack, então começamos criando um arquivo rackup usando o nome de arquivo padrão config.ru
. Nele exigimos roda
, e então criamos uma nova classe para representar nossa aplicação. Este aplicativo será herdado da classe Roda
.
Como o Roda é construído em cima do Rack, cada classe que herda do Roda
implicitamente se torna um aplicativo Rack. Para dizer ao Rack (e ao servidor web) para executar nosso aplicativo para solicitações HTTP, temos que dizer a ele para executar
a classe App
.
requer"roda" Class App
Em seguida, na linha de comando, executamos o comando rackup
para inicializar o servidor da web e começar a atender às solicitações.
rackup
Abra o navegador e navegue até http://127.0.0.1:9292 para ver “Hello world!”
Nosso aplicativo em seu estado atual retorna “Olá, mundo!” como a resposta para cada rota de solicitação. Vamos apresentar o método de roteamento do Roda para fazer o aplicativo retornar a mesma resposta, mas apenas para um caminho e método de solicitação específicos.
Métodos de árvore de roteamento de roda
método r.on
O primeiro método de árvore de roteamento é r.on
, que cria ramificações na árvore de roteamento. Vamos adicionar r.on
ao nosso aplicativo de exemplo.
requer"roda" Class App
Chamamos r.on
com a string users
, que corresponderá ao caminho da solicitação atual se o caminho da solicitação começar com users
.
O método Roda.route
é o início da árvore de roteamento. Todas as solicitações recebidas em nosso aplicativo serão processadas no bloco passado para Roda.route
. O bloco produz uma instância de solicitação de rota com alguns métodos adicionais. Convencionalmente, o argumento do bloco é denominado r
(por exemplo, | r |
). Os métodos adicionais (por exemplo, r.on
) passados para a instância de solicitação de rota são usados para rotear a solicitação.
Os métodos de rota aceitam argumentos chamados matchers, que são usados para corresponder à solicitação atual. Em nosso exemplo acima, passamos um correspondente de string users
como um argumento para r.on
para criar a ramificação users
.
No Roda, os combinadores de cordas geralmente correspondem ao primeiro segmento do caminho de solicitação. Portanto, se o caminho da solicitação começa com usuários
, ele corresponde e é redirecionado para o bloco passado, que retorna a mensagem “Olá, usuários!” string que Roda está usando como corpo de resposta.
Se o caminho da solicitação começar com perfil
(que não corresponde), r.on
retorna nil
sem ceder ao bloco, e a execução continuaria após a chamada. Se não houver nenhum outro bloco, que é o caso do nosso exemplo acima, Roda.route
retornará nil
e Roda retornará um código de status 404
com um corpo de resposta vazio.
método r.is
r.on
corresponderá a todos os caminhos de solicitação começando com users
, incluindo users/non-existent-user
. Normalmente, não é isso que queremos. Em vez disso, queremos retornar uma resposta 404
para qualquer caminho que não tenha sido tratado especificamente.
É aqui que o r.is
é útil. Ele corresponde a um caminho apenas se todos os argumentos corresponderem e não houver mais entradas no caminho após a correspondência. Em outras palavras, ele finaliza o caminho de roteamento.
r.is
corresponderá apenas a users
e não a users/non-existent-user
. O roteamento no Roda é feito usando uma combinação dos métodos r.on
e r.is
. r.on
faz a correspondência de prefixo do caminho da solicitação e r.is
faz a correspondência completa do caminho da solicitação. Assim, enquanto r.on
cria ramos, r.is
cria nós folha.
Vamos adicionar um r.on
ao nosso exemplo.
requer"roda" Class App
Nosso aplicativo corresponderá a qualquer solicitação com o caminho /users/list
. r.on
cria uma ramificação que lida com todos os caminhos em usuários
e r.is
cria um nó que corresponde apenas se o caminho atual for lista
. r.is
é capaz de corresponder a list
porque o caminho da solicitação é modificado conforme a solicitação está sendo roteada.
Quando a solicitação de usuários/lista
chega, a árvore de roteamento usa o caminho de solicitação inicial usuários
. Quando o método de solicitação r.on"users"
corresponde, ele consome users
da frente do caminho da solicitação. Dentro do bloco r.on
, o caminho da solicitação está vazio.
No próximo bloco r.is
, o caminho atual é list
e só corresponderá se todos os seus correspondentes concordarem em todo o caminho da solicitação. Portanto, neste caso de exemplo, a solicitação será correspondida e"Olá, usuários!"será devolvido.
r.get
Normalmente, o roteamento também leva em consideração o método de solicitação. Enquanto r.on
e r.is
se concentram no roteamento usando o caminho da solicitação, r.get
é para roteamento baseado em GET
método de solicitação. Se for chamado sem um matcher, ele colocará uma correspondência simples no método de solicitação. Se chamado com um matcher, uma correspondência de terminal é executada contra o caminho da solicitação.
requer"roda" Class App
Uma solicitação GET users/list
retornaria “Olá, usuários!”
r.post
Enquanto r.get
corresponde às solicitações GET
, r.post
corresponde às solicitações POST
.
requer"roda" Class App
Uma solicitação POST users/list
retornaria “User Added”. r.get
e r.post
são usados para lidar com vários métodos de solicitação em caminhos de solicitação semelhantes.
Execução de código durante o roteamento
Roda tem a capacidade de executar código durante o processo de roteamento. Isso torna mais fácil escrever um código mais simples e mais DRY e evita a duplicação de código.
Se você deseja verificar se alguém está logado antes de acessar uma rota, você pode colocar o código que verifica o login como a primeira linha do bloco Roda.route
. Isso é útil ao lidar com métodos de solicitação separados para o mesmo caminho de solicitação. Por exemplo, uma solicitação GET
encontrará um usuário e retornará seus detalhes, e uma solicitação POST
encontrará um usuário e atualizará seus detalhes.
Podemos abstrair a lógica para encontrar o usuário em um bloco de roteamento compartilhado por ambos os métodos de solicitação, conforme mostrado abaixo.
class App
Conclusão
O Roda foi projetado para ser leve e vem apenas com recursos essenciais para que seu aplicativo funcione rapidamente. Todos os recursos adicionais são carregados por meio de plug-ins ; O Roda vem com mais de 60 plug-ins integrados, todos mantidos com o mesmo nível de qualidade do Roda, então você raramente precisará de plug-ins externos.
Créditos
Jeremy Evans no Github
RubyConf 2014-Roda: The Routing Tree Web Framework de Jeremy Evans
Mastering Roda
A postagem Roda, o kit de ferramentas da web de árvore de roteamento: Um tutorial apareceu primeiro no LogRocket Blog .