← Stack web // stack web · back end · linguagem e plataforma

Ruby: script e app mínimo

Um arquivo .rb com cinco linhas dentro já é um programa que roda. O mesmo comando que executa esse arquivo executa também um app web que atende no seu localhost. As duas metades cabem nos dez minutos desta página, e nenhuma delas usa framework.

O que o Ruby resolve

Código de servidor é lido muitas vezes mais do que é escrito. Boa parte das linguagens cobra cerimônia antes da intenção: uma classe embrulhando um script de dez linhas, um tipo declarado em cada variável, um terminador no fim de cada instrução. Você paga esse pedágio uma vez ao escrever e paga de novo toda vez que alguém abre o arquivo pra descobrir o que ele faz.

O Ruby corta essa camada. Tudo na linguagem é objeto, inclusive número, e quase tudo que você escreve é chamada de método com o nome do que você quer fazer. 3.times repete três vezes. "texto".upcase devolve em maiúsculas. O ganho aparece na leitura, quando a linha em Ruby cabe em quase as mesmas palavras que a frase em português.

Os conceitos que você precisa antes da primeira linha

  • Tudo é objeto. A documentação oficial usa essa frase pra definir a linguagem. Número tem método, texto tem método, o valor vazio nil tem método. Por isso -3.abs funciona e devolve 3, sem função solta no meio do caminho.
  • Bloco. Um pedaço de código que você entrega pra um método executar, escrito entre do e end ou entre chaves. É a construção mais frequente do Ruby: repetição, leitura de arquivo e tratamento de sinal do sistema operacional aparecem todos nessa forma, e os dois arquivos deste exercício usam bloco.
  • Interpolação com puts. O puts escreve na tela e devolve nil, que a documentação oficial descreve como o valor de absolutamente nada. Dentro de aspas duplas, o trecho #{} insere o valor de uma expressão no meio do texto.
  • Gem e o comando gem. Gem é a biblioteca empacotada do Ruby, publicada no RubyGems. O comando gem install nome baixa e instala. O servidor do passo 6 vem de uma gem, porque o WEBrick saiu da instalação padrão do Ruby na versão 3.0.
  • require. Carrega uma biblioteca antes do uso, seja da instalação padrão, seja de uma gem instalada. Sem o require "webrick" na primeira linha, o nome WEBrick não existe pro seu programa.

A linguagem por dentro: tipos, métodos e objetos

Ruby tem tipagem dinâmica e forte, e leva o "tudo é objeto" até o fim: número, texto e até o nil respondem a métodos. Não existe função solta: o que parece função é método de algum objeto.

  • Os tipos do dia a dia: Integer, Float, String, Symbol (:nome, um identificador leve muito usado como chave), Array, Hash ({ nome: "Ana" }) e nil.
  • Método e bloco andam juntos: métodos se declaram com def, e os de coleção recebem um bloco pra aplicar em cada item: precos.sum, precos.map { |p| p * 2 }. O laço for existe, mas o Ruby idiomático itera com métodos e blocos.
  • Orientação a objetos: class, construtor initialize, atributos de instância com @ e o atalho attr_accessor que gera leitor e escritor. Herança usa <.
# tipos, método e classe em doze linhas
precos = [12.5, 30, 7]                # Array

def formata(valor)                    # método
  format("R$ %.2f", valor)
end

class Carrinho                        # orientação a objetos
  attr_accessor :itens
  def initialize
    @itens = []                       # atributo de instância
  end
end

puts formata(precos.sum)              # R$ 49.50

Se a sintaxe parece prosa, é de propósito: legibilidade é o valor central declarado da linguagem, e o custo disso você viu na página, mais de um jeito de escrever a mesma coisa.

Hello world: um script que imprime e um app que responde

Tudo roda no terminal, em Linux, macOS ou Windows. A versão estável em vigor é a 4.0.6, publicada em 14/07/2026, e qualquer 3.x recente serve pro que vem abaixo.

  1. Confira o Ruby que você tem:

    ruby --version

    A resposta tem que ser um número de versão. Se o terminal disser que o comando não existe, a documentação oficial de instalação dá o caminho por sistema: sudo apt-get install ruby-full no Debian e no Ubuntu, brew install ruby no macOS, winget install RubyInstallerTeam.Ruby.3.2 no Windows.

  2. Crie uma pasta pro exercício e entre nela, pros dois arquivos ficarem juntos:

    mkdir ola-ruby
    cd ola-ruby
  3. Num editor de texto, crie o arquivo ola.rb dentro dessa pasta, com este conteúdo:

    nome = "mundo"
    puts "Olá, #{nome}"
    
    3.times do |n|
      puts "linha #{n + 1}"
    end

    O 3.times é um método do número 3, e o trecho entre do e end é o bloco que ele executa a cada volta. O n entre barras verticais é o contador que o método entrega pro bloco, começando em zero.

  4. Rode o script:

    ruby ola.rb
  5. Instale a gem do servidor:

    gem install webrick

    Se o terminal reclamar de permissão de escrita, rode gem install --user-install webrick, que instala na sua pasta de usuário em vez da pasta do sistema. A versão publicada da gem é a 1.9.2, de 26/11/2025.

  6. Na mesma pasta, crie o arquivo app.rb:

    require "webrick"
    
    servidor = WEBrick::HTTPServer.new(Port: 8000, BindAddress: "127.0.0.1")
    
    servidor.mount_proc "/" do |req, res|
      res.content_type = "text/html; charset=utf-8"
      res.body = "<h1>Esta resposta saiu de um app Ruby</h1>"
    end
    
    trap("INT") { servidor.shutdown }
    
    servidor.start

    O BindAddress prende o servidor à sua própria máquina, e vale escrever ele sempre: sem essa opção, o app atende por todas as interfaces de rede e fica visível pra quem estiver na mesma rede que você. O mount_proc diz o que responder no endereço /, e a documentação avisa que ele precisa vir antes do start. O trap("INT") é o que faz o Ctrl + C encerrar o servidor de forma limpa.

  7. Suba o app:

    ruby app.rb
  8. Com o app de pé, abra http://127.0.0.1:8000/ no navegador. Pra encerrar, volte na janela do servidor e aperte Ctrl + C.

A prova de que funcionou. São duas provas, uma por metade do exercício. No passo 4, o terminal imprime quatro linhas, Olá, mundo seguido de linha 1, linha 2 e linha 3, e devolve o prompt logo depois. Repare que o contador do bloco começa em zero e a soma n + 1 é o que faz a contagem sair de 1 a 3. No passo 7, a janela mostra três linhas de registro do WEBrick, cada uma com data e hora entre colchetes e a marca INFO: a versão do WEBrick, a versão do Ruby, e a linha WEBrick::HTTPServer#start: pid= com o número do processo e port=8000 no fim. Depois disso o prompt fica parado, sem voltar. Prompt travado é o sinal certo aqui, porque o processo está de pé esperando pedido. No navegador, o endereço mostra "Esta resposta saiu de um app Ruby" em corpo grande, com acento correto na tela, o que prova que o charset=utf-8 da resposta chegou. Volte na janela do servidor e você vai ver duas linhas de acesso novas. A primeira sai no formato de log comum, com o endereço de origem, a data, o pedido "GET / HTTP/1.1", o código 200 e o tamanho da resposta em bytes. A segunda é curta, - -> /, e sai no formato de referência, que o WEBrick liga junto com o outro por padrão. Dois erros são frequentes nesse ponto. Um LoadError reclamando de webrick quer dizer que o passo 5 não completou. Um Errno::EADDRINUSE quer dizer que a porta 8000 já está ocupada por outro programa: troque o número por 8001 no app.rb e rode de novo.

O que o Ruby não é

A confusão mais comum é tratar Ruby e Ruby on Rails como o mesmo nome. Ruby é a linguagem, de 1995. Rails, nas palavras do próprio guia oficial dele, é um framework de desenvolvimento de aplicações web escrito na linguagem Ruby, distribuído como gem e instalado por quem quiser usar. O app do passo 6 responde HTTP sem uma linha de Rails no meio, e serve de prova disso.

A distinção tem consequência prática na hora de procurar resposta. Erro de sintaxe, bloco e método são assunto da documentação do Ruby. Rota, migração de banco e ActiveRecord são assunto do Rails, e a resposta pra um raramente está no manual do outro. Vale a mesma cautela com o WEBrick: a documentação dele abre dizendo que o servidor foi feito pra teste e desenvolvimento local, sem intenção de uso em produção. Ele existe pra provar que o app responde na sua máquina, e é bom nisso.

Fontes

Aviso de método: os comandos e o código desta página saíram da documentação oficial citada acima, conferida em 15/08/2026. No mesmo 15/08/2026 a gente rodou o exercício inteiro em Linux, no Ruby 4.0.6 compilado a partir do tarball oficial. O passo 1 respondeu ruby 4.0.6 (2026-07-14 revision 03b6d3f889) +PRISM [x86_64-linux]. O ruby ola.rb imprimiu Olá, mundo, linha 1, linha 2 e linha 3, nessa ordem. O gem install webrick devolveu Successfully installed webrick-1.9.2. Com o ruby app.rb de pé na porta 8000, um pedido feito pelo terminal na raiz voltou HTTP/1.1 200 OK, com Content-Type: text/html; charset=utf-8, Content-Length: 42, cabeçalho Server: WEBrick/1.9.2 (Ruby/4.0.6/2026-07-14) e o corpo <h1>Esta resposta saiu de um app Ruby</h1>. Os dois erros descritos na prova foram reproduzidos de propósito, o Errno::EADDRINUSE ao subir o app duas vezes na mesma porta e o LoadError ao rodar o app sem a gem instalada.

Para continuar

Do lado do back end, a linguagem é escolha. PHP chega no mesmo lugar por outro caminho, montando a página dentro do servidor a cada pedido do navegador. Java vai pro extremo oposto do Ruby, com compilação antes de rodar e tipo declarado em tudo, e é bom ver as duas pontas pra entender o que você ganha e o que você paga em cada uma. As três estão lado a lado no mapa da stack web, junto do resto da trilha.

O curso desta trilha está em preparação. A lista paga menos.

Os tutoriais daqui continuam gratuitos. O que está a caminho é um curso pago que transforma esse mapa em formação guiada, na ordem certa e com projeto. Deixe seu e-mail: você recebe os estudos novos gratuitos e, no lançamento, o desconto de quem entrou na lista primeiro.