Uma aplicação web fullstack desenvolvida em Ruby on Rails para gerenciamento de tarefas organizadas por categorias, com autenticação de usuários via Devise.
- Sobre o Projeto
- Funcionalidades
- Tech Stack
- Modelagem de Dados
- Arquitetura e Decisões Técnicas
- Pré-requisitos
- Instalação e Execução
- Rotas
- Estrutura do Projeto
- Testes
O Task Manager permite que usuários autenticados organizem suas tarefas em categorias customizadas. Cada tarefa possui título, descrição, prioridade (baixa, média, alta, altíssima), data de vencimento e status (pendente/concluída). Os dados são completamente isolados por usuário.
- Cadastro, login e gerenciamento de sessão (Devise)
- CRUD completo de Categorias
- CRUD completo de Tarefas aninhadas por categoria
- Atualização de status da tarefa em tempo real via Turbo Streams (sem reload de página)
- Isolamento de dados por usuário — nenhum usuário acessa dados de outro
- Validações de modelo com feedback de erros na interface
- Interface responsiva com Tailwind CSS
- Tradução em pt-BR
| Camada | Tecnologia |
|---|---|
| Linguagem | Ruby 3.4.9 |
| Framework | Rails 8.1.3 |
| Banco de dados | SQLite3 |
| Autenticação | Devise |
| Frontend | ERB + Tailwind CSS 4 |
| JavaScript | Hotwire (Turbo + Stimulus) |
| Servidor | Puma |
User (1) ——< (N) Category (1) ——< (N) Task
users
| Coluna | Tipo | Descrição |
|---|---|---|
| string | Único, obrigatório | |
| encrypted_password | string | Gerenciado pelo Devise |
categories
| Coluna | Tipo | Descrição |
|---|---|---|
| title | string | 5–20 chars, único por usuário |
| description | string | Máximo 100 chars |
| user_id | integer | FK → users (NOT NULL) |
tasks
| Coluna | Tipo | Descrição |
|---|---|---|
| title | string | 2–30 chars |
| description | string | Máximo 140 chars |
| status | integer | Enum: pending (0), completed (1) |
| priority | integer | Enum: low (0), medium (1), high (2), highest (3) |
| due_date | date | Data de vencimento |
| category_id | integer | FK → categories (NOT NULL) |
User has_many :categories
has_many :tasks, through: :categories
Category belongs_to :user
has_many :tasks, dependent: :destroy
Task belongs_to :categoryCategory#title— presença, 5–20 chars, unicidade com escopo poruser_id(case-insensitive)Category#description— presença, máximo 100 charsTask#title— presença, 2–30 charsTask#description— presença, máximo 140 charsTask#priority— presençaTask#due_date— não pode ser no passado (validação customizada)
Toda regra de negócio reside nos models. Os controllers delegam para o model e lidam apenas com fluxo HTTP. O ApplicationController centraliza a autenticação global via before_action :authenticate_user!.
O CategoriesController carrega categorias sempre via current_user.categories, nunca diretamente pelo id. O TasksController encadeia a busca: category → task, garantindo que nenhum usuário acesse recursos de outro.
A atualização de status de uma tarefa (pendente ↔ concluída) usa format.turbo_stream no controller e um template update.turbo_stream.erb que atualiza 4 fragmentos do DOM sem reload — lista de tarefas, badge de pendentes, cabeçalho e detalhes da tarefa.
Task usa enums do Rails para status e priority, garantindo type-safety no banco e métodos de conveniência (task.completed?, task.high?) nos models.
- Ruby 3.4.9
- Bundler
- SQLite3
- Node.js (para Tailwind CSS)
# 1. Instalar dependências Ruby
bundle install
# 2. Instalar dependências Node
npm install
# 3. Criar e migrar o banco de dados
bin/rails db:create db:migrate
# 4. (Opcional) Popular com dados iniciais
bin/rails db:seed
# 5. Iniciar o servidor de desenvolvimento
bin/devAcesse em http://localhost:3000.
| Método | Path | Ação |
|---|---|---|
| GET | / |
Listagem de categorias |
| GET/POST | /categories |
Listar / Criar categoria |
| GET | /categories/:id |
Exibir categoria com tarefas |
| GET/PATCH/DELETE | /categories/:id/edit |
Editar / Atualizar / Deletar categoria |
| GET/POST | /categories/:category_id/tasks/new |
Nova tarefa |
| GET | /categories/:category_id/tasks/:id |
Exibir tarefa |
| PATCH | /categories/:category_id/tasks/:id |
Atualizar tarefa (suporta Turbo Stream) |
| DELETE | /categories/:category_id/tasks/:id |
Deletar tarefa |
| GET/POST | /users/sign_in |
Login |
| GET/POST | /users/sign_up |
Cadastro |
| DELETE | /users/sign_out |
Logout |
Todas as rotas de categorias e tarefas requerem autenticação. Usuários não autenticados são redirecionados para o login.
app/
├── controllers/
│ ├── application_controller.rb # authenticate_user! global
│ ├── categories_controller.rb # CRUD scoped por usuário
│ └── tasks_controller.rb # CRUD aninhado, Turbo Stream
├── models/
│ ├── user.rb # Devise + associações
│ ├── category.rb # Validações, belongs_to :user
│ └── task.rb # Enums, validação customizada de due_date
├── views/
│ ├── categories/ # Index, show, new, edit, _form, _category
│ ├── tasks/ # Show, new, edit, _form, _task, _tasks_sections,
│ │ # _show_header, _show_details, turbo_stream, jbuilder
│ ├── shared/ # _breadcrumb, _glass_container, _error_alert, _success_notice
│ └── devise/ # Views customizadas de autenticação
├── helpers/
│ └── tasks_helper.rb # Badge CSS por prioridade/status/due_date
└── javascript/
└── controllers/
└── checkbox_submit_controller.js # Auto-submit ao marcar checkbox
config/
├── routes.rb
└── locales/ # pt-BR (rails-i18n + devise-i18n)
db/
├── schema.rb
└── migrate/