Mão na massa
Travou em algum passo? Veja Travou?, no fim da página.
1. Abra um terminal novo
Abra o seu codespace. Se o servidor ainda estiver ligado no terminal, deixe ele lá: abra um terminal novo pelo botão + do painel do terminal.

Confira: o terminal novo mostra uma linha terminando em $, pronta para receber comandos, e está na pasta do projeto, /workspaces/mural-de-recados.
À direita do painel aparece a lista de terminais: puma é o terminal do servidor, e bash é o terminal novo. Para trocar de um para o outro, clique no nome.

Se aparecer uma dica do Copilot no terminal novo, pode ignorar.
Terminou? Abra o passo 2. Crie o model Message
2. Crie o model Message
No Rails, a parte do app que cuida de uma informação, como os recados, se chama model (modelo, em português). Vamos criar o model dos recados, dizendo quais informações ele tem. No código, os nomes ficam em inglês: o recado se chama Message, a autora é author e a mensagem é content (conteúdo). A mensagem se chama content, e não message, para o código não ficar message.message.
Dê um palpite: o comando abaixo diz author:string e content:text. O que você acha que string e text querem dizer?
No terminal, digite:
bin/rails generate model Message author:string content:text
Confira: o terminal mostra uma lista de arquivos criados, parecida com esta:
invoke active_record
create db/migrate/20261003120000_create_messages.rb
create app/models/message.rb
invoke test_unit
create test/models/message_test.rb
create test/fixtures/messages.yml
O comando criou quatro arquivos:
db/migrate/…_create_messages.rb: a migration, com as instruções para criar a tabela dos recados no banco de dados. Você vai revisar esse arquivo no próximo passo. O número no começo do nome é a data e a hora em que você rodou o comando, então o seu vai ser diferente.app/models/message.rb: o modelMessage, que representa um recado dentro do app.test/models/message_test.rb: um lugar para escrever testes automatizados do model.test/fixtures/messages.yml: recados de exemplo, usados só pelos testes.
Model e migration
Pense numa planilha de recados:
- A migration monta a planilha: cria a aba e dá nome às colunas,
authorecontent.- O model é uma assistente especialista: ela só cuida da planilha de recados. Escreve uma linha nova para cada recado, procura, conta e apaga. Se um dia o app guardar outro tipo de informação, ela ganha uma assistente própria, ou seja, outro model.
Um prepara o lugar; o outro trabalha com o que está lá dentro.
Por enquanto, a gente vai pular os testes. Você não precisa abrir nem mexer nos dois arquivos da pasta test: pode deixar eles lá, do jeito que o Rails criou.
Sobre o palpite: string é um texto curto, como um nome; text é um texto longo, como uma mensagem.
Terminou? Abra o passo 3. Revise a migration
3. Revise a migration
O generate criou uma migration (migração, em português): um arquivo com as instruções para criar a tabela de recados no banco de dados. Ela ainda não foi aplicada.
No Explorer, abra a pasta db/migrate e clique no arquivo que termina em _create_messages.rb. Ele é parecido com isto:
class CreateMessages < ActiveRecord::Migration[8.1]
def change
create_table :messages do |t|
t.string :author
t.text :content
t.timestamps
end
end
end
Dê um palpite: você consegue achar onde aparecem a autora e a mensagem? E o que você acha que faz o t.timestamps?
Confira: a linha create_table :messages cria a tabela messages (os recados), e as linhas t.string :author e t.text :content criam uma coluna para cada informação. O t.timestamps cria duas colunas que o Rails preenche sozinho: created_at (quando o recado foi criado) e updated_at (quando foi alterado pela última vez).
Você não precisa mudar nada neste arquivo.
Repare
A migration ainda não criou nada. Ela é só a instrução, como o desenho de uma planilha com o nome de cada coluna. A planilha de verdade, a tabela no banco de dados, ainda não existe: ela é criada no próximo passo.
Terminou? Abra o passo 4. Rode a migration
4. Rode a migration
Agora vamos aplicar a migration, para a tabela existir de verdade no banco de dados. No terminal, digite:
bin/rails db:migrate
Confira: o terminal mostra algo parecido com isto:
== 20261003120000 CreateMessages: migrating ==========
-- create_table(:messages)
-> 0.0012s
== 20261003120000 CreateMessages: migrated (0.0013s) =
A tabela messages foi criada. Repare também no arquivo db/schema.rb: ele mostra como o banco de dados está agora, com a tabela nova.
Terminou? Abra o passo 5. Guarde um recado pelo console
5. Guarde um recado pelo console
Ainda não existe uma tela para postar recados: ela vem no capítulo 04. Mas já dá para guardar um recado pelo console, um jeito de conversar com o app escrevendo código Ruby direto no terminal.
No terminal, digite:
bin/rails console
O terminal muda e passa a esperar código Ruby. Digite:
Message.create(author: "Ana", content: "Meu primeiro recado!")
Confira: o console mostra uma linha com INSERT INTO "messages" (o Rails guardando o recado no banco de dados) e, no fim, o recado criado, com id: 1, a autora, a mensagem e as datas.
Agora pergunte quantos recados existem:
Message.count
Confira: a resposta é 1.
O que o model fez aqui?
O
Message.createpediu para o model, a assistente especialista em recados, escrever uma linha nova na planilhamessages:
id author content created_at 1 Ana Meu primeiro recado! (agora) Você só disse a autora e a mensagem: o
ide as datas ela preencheu sozinha. E oMessage.countpediu para ela contar quantas linhas a planilha tem.
Terminou? Abra o passo 6. Feche e abra o console de novo
6. Feche e abra o console de novo
Dê um palpite: se você fechar o console e abrir de novo, o recado da Ana continua lá?
Para sair do console, digite:
exit
Abra o console de novo:
bin/rails console
E pergunte de novo:
Message.count
Confira: a resposta continua sendo 1. O recado não estava guardado no console: estava no banco de dados, e continua lá mesmo depois de fechar tudo. Esse era o desafio do capítulo! 🎉
Para ver o recado inteiro, digite:
Message.first
Depois, saia do console com exit.
Terminou? Abra o passo 7. Guarde o seu progresso
7. Guarde o seu progresso
Guarde o seu progresso com um commit, como no passo Guarde o seu progresso de Por onde começar?:
- No painel Source Control, clique no + ao lado de Changes (Stage All Changes).
- Escreva a mensagem
Cria o model Messagee clique em Commit. - Clique em Sync Changes e, na janela que abrir, em OK.
Confira: em Graph, o commit Cria o model Message aparece com a etiqueta main e o ícone de nuvem.
Travou?
Abra o problema que aconteceu com você:
O terminal diz Could not find command ou No such file or directory
Você provavelmente está fora da pasta do projeto. Digite cd /workspaces/mural-de-recados e tente de novo.
Errei o nome de um campo no generate
Se você ainda não rodou a migration, desfaça o que o generate criou e gere de novo:
bin/rails destroy model Message
Se você já rodou a migration, desfaça ela antes, com bin/rails db:rollback, e depois rode o destroy.
Na dúvida, peça ajuda para alguém da mentoria. 💜
O console diz NameError: uninitialized constant Message
Confira se você escreveu Message com M maiúsculo: para o Ruby, message e Message são coisas diferentes. Se estiver certo, confira se o arquivo app/models/message.rb existe (passo 2).
O console diz no such table: messages
A migration ainda não foi aplicada. Saia do console com exit e rode bin/rails db:migrate (passo 4).
O navegador mostra o erro Migrations are pending
Você criou a migration, mas ainda não rodou. Rode bin/rails db:migrate (passo 4) e recarregue a página.
O console não deixa digitar comandos do terminal
Você ainda está dentro do console, que só entende Ruby. Digite exit para voltar ao terminal.
Mentoria: veja as notas deste capítulo.
Terminou?
Siga para O que aconteceu? e entenda cada passo.